Merge last PGO-green changeset of mozilla-inbound to mozilla-central
authorEd Morley <emorley@mozilla.com>
Sat, 29 Sep 2012 00:08:58 +0100
changeset 108609 b62b229a4d4191270e44bad30a8695c555eedadb
parent 108519 b274e8e3479f556868412ea9fba4af4adf39deee (current diff)
parent 108608 2c694d8bf7a59441faba5d6266862299fa354b03 (diff)
child 108610 dcc6a2d0bd16fc5ded65e9acbe4f17ef15c178d6
push id82
push usershu@rfrn.org
push dateFri, 05 Oct 2012 13:20:22 +0000
milestone18.0a1
Merge last PGO-green changeset of mozilla-inbound to mozilla-central
content/base/src/nsXMLHttpRequest.cpp
--- a/accessible/src/base/nsAccessibilityService.cpp
+++ b/accessible/src/base/nsAccessibilityService.cpp
@@ -950,17 +950,17 @@ nsAccessibilityService::GetOrCreateAcces
   }
 
   // Attempt to create an accessible based on what we know.
   nsRefPtr<Accessible> newAcc;
 
   // Create accessible for visible text frames.
   if (content->IsNodeOfType(nsINode::eTEXT)) {
     nsAutoString text;
-    weakFrame->GetRenderedText(&text, nullptr, nullptr, 0, PR_UINT32_MAX);
+    weakFrame->GetRenderedText(&text, nullptr, nullptr, 0, UINT32_MAX);
     if (text.IsEmpty()) {
       if (aIsSubtreeHidden)
         *aIsSubtreeHidden = true;
 
       return nullptr;
     }
 
     newAcc = weakFrame->CreateAccessible();
--- a/accessible/src/generic/Accessible.h
+++ b/accessible/src/generic/Accessible.h
@@ -447,17 +447,17 @@ public:
    *
    * @param aText         [in] returned text of the accessible
    * @param aStartOffset  [in, optional] start offset inside of the accessible,
    *                        if missed entire text is appended
    * @param aLength       [in, optional] required length of text, if missed
    *                        then text form start offset till the end is appended
    */
   virtual void AppendTextTo(nsAString& aText, uint32_t aStartOffset = 0,
-                            uint32_t aLength = PR_UINT32_MAX);
+                            uint32_t aLength = UINT32_MAX);
 
   /**
    * Assert if child not in parent's cache if the cache was initialized at this
    * point.
    */
   void TestChildCache(Accessible* aCachedChild) const;
 
   /**
--- a/accessible/src/generic/TextLeafAccessible.h
+++ b/accessible/src/generic/TextLeafAccessible.h
@@ -18,17 +18,17 @@ class TextLeafAccessible : public Linkab
 {
 public:
   TextLeafAccessible(nsIContent* aContent, DocAccessible* aDoc);
   virtual ~TextLeafAccessible();
 
   // Accessible
   virtual mozilla::a11y::role NativeRole();
   virtual void AppendTextTo(nsAString& aText, uint32_t aStartOffset = 0,
-                            uint32_t aLength = PR_UINT32_MAX);
+                            uint32_t aLength = UINT32_MAX);
   virtual ENameValueFlag Name(nsString& aName);
 
   // TextLeafAccessible
   void SetText(const nsAString& aText) { mText = aText; }
   const nsString& Text() const { return mText; }
 
 protected:
   // Accessible
--- a/accessible/src/html/HTMLListAccessible.h
+++ b/accessible/src/html/HTMLListAccessible.h
@@ -81,17 +81,17 @@ public:
   // nsAccessNode
   virtual nsIFrame* GetFrame() const;
 
   // Accessible
   virtual ENameValueFlag Name(nsString& aName);
   virtual a11y::role NativeRole();
   virtual uint64_t NativeState();
   virtual void AppendTextTo(nsAString& aText, uint32_t aStartOffset = 0,
-                            uint32_t aLength = PR_UINT32_MAX);
+                            uint32_t aLength = UINT32_MAX);
 
   // HTMLListBulletAccessible
 
   /**
    * Return true if the bullet is inside of list item element boundaries.
    */
   bool IsInside() const;
 };
--- a/accessible/tests/mochitest/events/test_focus_contextmenu.xul
+++ b/accessible/tests/mochitest/events/test_focus_contextmenu.xul
@@ -18,22 +18,31 @@
   <script type="application/javascript"
           src="../states.js" />
   <script type="application/javascript"
           src="../events.js" />
 
   <script type="application/javascript">
     //gA11yEventDumpID = "eventdump"; // debug stuff
     gA11yEventDumpToConsole = true; // debug stuff
+    
+    var winLowerThanVista = navigator.platform.indexOf("Win") == 0;
+    if (winLowerThanVista) {
+      var version = Components.classes["@mozilla.org/system-info;1"]
+                              .getService(Components.interfaces.nsIPropertyBag2)
+                              .getProperty("version");
+      version = parseFloat(version);
+      winLowerThanVista = !(version >= 6.0);
+    }
 
     var gQueue = null;
     function doTests()
     {
       // bug 746183 - Whole file times out on OS X
-      if (MAC) {
+      if (MAC || winLowerThanVista) {
         todo(false, "Reenable on mac after fixing bug 746183!");
         SimpleTest.finish();
         return;
       }
 
       // Test focus events.
       gQueue = new eventQueue();
 
--- a/accessible/tests/mochitest/treeupdate/test_imagemap.html
+++ b/accessible/tests/mochitest/treeupdate/test_imagemap.html
@@ -319,16 +319,20 @@
                           "http://www.bbc.co.uk/radio4/atoz/index.shtml#b");
         area.setAttribute("coords", "17,0,30,14");
         area.setAttribute("alt", "b");
         area.setAttribute("shape", "rect");
 
         map.appendChild(area);
 
         this.containerNode.appendChild(map);
+        
+        // force repainting of the image
+        // XXX this is a hack. Fix bug 745788.
+        document.getElementById(aImageID).style.opacity = 0.8;
       }
 
       this.finalCheck = function insertMap_finalCheck()
       {
         var accTree =
           { SECTION: [
             { IMAGE_MAP: [
               { LINK: [ ] }
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -3953,17 +3953,18 @@
                     class="tab-background-middle"/>
           <xul:hbox xbl:inherits="pinned,selected,titlechanged"
                     class="tab-background-end"/>
         </xul:hbox>
         <xul:hbox xbl:inherits="pinned,selected,titlechanged"
                   class="tab-content" align="center">
           <xul:image xbl:inherits="fadein,pinned,busy,progress,selected"
                      class="tab-throbber"
-                     role="presentation"/>
+                     role="presentation"
+                     layer="true" />
           <xul:image xbl:inherits="validate,src=image,fadein,pinned,selected"
                      class="tab-icon-image"
                      role="presentation"/>
           <xul:label flex="1"
                      xbl:inherits="value=label,crop,accesskey,fadein,pinned,selected"
                      class="tab-text tab-label"
                      role="presentation"/>
           <xul:toolbarbutton anonid="close-button"
--- a/browser/components/tabview/content.js
+++ b/browser/components/tabview/content.js
@@ -36,17 +36,19 @@ let WindowEventHandler = {
     sendSyncMessage("Panorama:DOMWillOpenModalDialog");
   },
 
   // ----------
   // Function: onMozAfterPaint
   // Sends an asynchronous message when the "onMozAfterPaint" event
   // is fired.
   onMozAfterPaint: function WEH_onMozAfterPaint(event) {
-    sendAsyncMessage("Panorama:MozAfterPaint");
+    if (event.clientRects.length > 0) {
+      sendAsyncMessage("Panorama:MozAfterPaint");
+    }
   }
 };
 
 // add event listeners
 addEventListener("DOMWillOpenModalDialog", WindowEventHandler.onDOMWillOpenModalDialog, false);
 addEventListener("MozAfterPaint", WindowEventHandler.onMozAfterPaint, false);
 
 // ----------
--- a/browser/devtools/highlighter/test/browser_inspector_invalidate.js
+++ b/browser/devtools/highlighter/test/browser_inspector_invalidate.js
@@ -2,17 +2,17 @@
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 let doc;
 let div;
 
 function createDocument()
 {
   div = doc.createElement("div");
-  div.setAttribute("style", "width: 100px; height: 100px;");
+  div.setAttribute("style", "width: 100px; height: 100px; background:yellow;");
   doc.body.appendChild(div);
 
   Services.obs.addObserver(runTest,
     InspectorUI.INSPECTOR_NOTIFICATIONS.OPENED, false);
   InspectorUI.toggleInspectorUI();
 }
 
 function runTest(subject)
@@ -22,22 +22,27 @@ function runTest(subject)
 
   InspectorUI.highlighter.highlight(div);
 
   executeSoon(function() {
     let outline = InspectorUI.highlighter.outline;
     is(outline.style.width, "100px", "selection has the right width");
 
     div.style.width = "200px";
-    setTimeout(function () {
+    function pollTest() {
+      if (outline.style.width == "100px") {
+    	setTimeout(pollTest, 10);
+    	return;
+      }
       is(outline.style.width, "200px", "selection updated");
       InspectorUI.closeInspectorUI();
       gBrowser.removeCurrentTab();
       finish();
-    }, 1000);
+    }
+    setTimeout(pollTest, 10);
   });
 }
 
 function test()
 {
   waitForExplicitFinish();
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.selectedBrowser.addEventListener("load", function() {
--- a/caps/idl/nsIScriptSecurityManager.idl
+++ b/caps/idl/nsIScriptSecurityManager.idl
@@ -266,17 +266,17 @@ interface nsIScriptSecurityManager : nsI
      * principal.
      */
     [noscript,notxpcom] nsIPrincipal getCxSubjectPrincipal(in JSContextPtr cx);
     [noscript,notxpcom] nsIPrincipal getCxSubjectPrincipalAndFrame(in JSContextPtr cx,
                                                                    out JSStackFramePtr fp);
 
 
     const unsigned long NO_APP_ID = 0;
-    const unsigned long UNKNOWN_APP_ID = 4294967295; // PR_UINT32_MAX
+    const unsigned long UNKNOWN_APP_ID = 4294967295; // UINT32_MAX
 
     /**
      * Returns the extended origin for the uri.
      * appId can be NO_APP_ID or a valid app id. appId should not be
      * UNKNOWN_APP_ID.
      * inMozBrowser has to be true if the uri is inside a mozbrowser iframe.
      */
     AUTF8String getExtendedOrigin(in nsIURI uri, in unsigned long appId,
--- a/config/rules.mk
+++ b/config/rules.mk
@@ -1574,23 +1574,16 @@ endef
  )
 
 ################################################################################
 # Special gmake rules.
 ################################################################################
 
 
 #
-# Disallow parallel builds with MSVC < 8
-#
-ifneq (,$(filter 1200 1300 1310,$(_MSC_VER)))
-.NOTPARALLEL:
-endif
-
-#
 # Re-define the list of default suffixes, so gmake won't have to churn through
 # hundreds of built-in suffix rules for stuff we don't need.
 #
 .SUFFIXES:
 
 #
 # Fake targets.  Always run these rules, even if a file/directory with that
 # name already exists.
--- a/configure.in
+++ b/configure.in
@@ -2205,34 +2205,32 @@ ia64*-hpux*)
         MOZ_DEBUG_LDFLAGS='-DEBUG -DEBUGTYPE:CV'
         WARNINGS_AS_ERRORS='-WX'
         MOZ_OPTIMIZE_FLAGS='-O1'
         MOZ_FIX_LINK_PATHS=
         DYNAMIC_XPCOM_LIBS='$(LIBXUL_DIST)/lib/xpcom.lib $(LIBXUL_DIST)/lib/xpcom_core.lib $(LIBXUL_DIST)/lib/mozalloc.lib'
         XPCOM_FROZEN_LDOPTS='$(LIBXUL_DIST)/lib/xpcom.lib $(LIBXUL_DIST)/lib/mozalloc.lib'
         LIBXUL_LIBS='$(LIBXUL_DIST)/lib/xpcom.lib $(LIBXUL_DIST)/lib/xul.lib $(LIBXUL_DIST)/lib/mozalloc.lib'
         MOZ_COMPONENT_NSPR_LIBS='$(NSPR_LIBS)'
-        if test $_MSC_VER -ge 1400; then
-            LDFLAGS="$LDFLAGS -LARGEADDRESSAWARE -NXCOMPAT"
-            dnl For profile-guided optimization
-            PROFILE_GEN_CFLAGS="-GL"
-            PROFILE_GEN_LDFLAGS="-LTCG:PGINSTRUMENT"
-            dnl XXX: PGO builds can fail with warnings treated as errors,
-            dnl specifically "no profile data available" appears to be
-            dnl treated as an error sometimes. This might be a consequence
-            dnl of using WARNINGS_AS_ERRORS in some modules, combined
-            dnl with the linker doing most of the work in the whole-program
-            dnl optimization/PGO case. I think it's probably a compiler bug,
-            dnl but we work around it here.
-            PROFILE_USE_CFLAGS="-GL -wd4624 -wd4952"
-            dnl XXX: should be -LTCG:PGOPTIMIZE, but that fails on libxul.
-            dnl Probably also a compiler bug, but what can you do?
-            PROFILE_USE_LDFLAGS="-LTCG:PGUPDATE"
-            LDFLAGS="$LDFLAGS -DYNAMICBASE"
-        fi
+        LDFLAGS="$LDFLAGS -LARGEADDRESSAWARE -NXCOMPAT"
+        dnl For profile-guided optimization
+        PROFILE_GEN_CFLAGS="-GL"
+        PROFILE_GEN_LDFLAGS="-LTCG:PGINSTRUMENT"
+        dnl XXX: PGO builds can fail with warnings treated as errors,
+        dnl specifically "no profile data available" appears to be
+        dnl treated as an error sometimes. This might be a consequence
+        dnl of using WARNINGS_AS_ERRORS in some modules, combined
+        dnl with the linker doing most of the work in the whole-program
+        dnl optimization/PGO case. I think it's probably a compiler bug,
+        dnl but we work around it here.
+        PROFILE_USE_CFLAGS="-GL -wd4624 -wd4952"
+        dnl XXX: should be -LTCG:PGOPTIMIZE, but that fails on libxul.
+        dnl Probably also a compiler bug, but what can you do?
+        PROFILE_USE_LDFLAGS="-LTCG:PGUPDATE"
+        LDFLAGS="$LDFLAGS -DYNAMICBASE"
     fi
     AC_DEFINE(HAVE_SNPRINTF)
     AC_DEFINE(_WINDOWS)
     AC_DEFINE(WIN32)
     AC_DEFINE(XP_WIN)
     AC_DEFINE(XP_WIN32)
     AC_DEFINE(HW_THREADS)
     AC_DEFINE(STDC_HEADERS)
@@ -2280,27 +2278,24 @@ ia64*-hpux*)
     esac
 
     case "$target" in
     i*86-*)
         if test "$HAVE_64BIT_OS"; then
             AC_MSG_ERROR([You are targeting i386 but using the 64-bit compiler.])
         fi
 
-        if test $_MSC_VER -ge 1400; then
-            LDFLAGS="$LDFLAGS -SAFESEH"
-        fi
-
         if test -n "$GNU_CC"; then
             CFLAGS="$CFLAGS -mstackrealign -fno-keep-inline-dllexport"
             CXXFLAGS="$CXXFLAGS -mstackrealign -fno-keep-inline-dllexport"
             LDFLAGS="$LDFLAGS -Wl,--enable-stdcall-fixup"
         else
             AC_DEFINE(HAVE_STDCALL)
             DSO_LDOPTS="$DSO_LDOPTS -MACHINE:X86"
+            LDFLAGS="$LDFLAGS -SAFESEH"
         fi
 
     	AC_DEFINE(_X86_)
 	;;
     x86_64-*)
         if test -n "$_WIN32_MSVC"; then
             DSO_LDOPTS="$DSO_LDOPTS -MACHINE:X64"
         fi
--- a/content/Makefile.in
+++ b/content/Makefile.in
@@ -20,18 +20,9 @@ endif
 ifdef MOZ_XTF
 PARALLEL_DIRS   += xtf
 endif
 
 ifdef ENABLE_TESTS
 TOOL_DIRS += test
 endif
 
-# Prevent floating point errors caused by VC++ optimizations
-ifeq ($(OS_ARCH)_$(GNU_CC),WINNT_)
-ifeq (,$(filter-out 1200 1300 1310,$(_MSC_VER)))
-CFLAGS += -Op
-else
-CFLAGS += -fp:precise
-endif
-endif # WINNT
-
 include $(topsrcdir)/config/rules.mk
--- a/content/base/public/nsIMessageManager.idl
+++ b/content/base/public/nsIMessageManager.idl
@@ -330,8 +330,35 @@ interface nsIFrameScriptLoader : nsISupp
    */
   void loadFrameScript(in AString aURL, in boolean aAllowDelayedLoad);
 
   /**
    * Removes aURL from the list of scripts which support delayed load.
    */
   void removeDelayedFrameScript(in AString aURL);
 };
+
+[scriptable, builtinclass, uuid(5f552699-01a2-4f17-833b-ddb3fa0d98b2)]
+interface nsIPermissionChecker : nsISupports
+{
+
+  /**
+   * Return true iff the "remote" process has |aPermission|.  This is
+   * intended to be used by JS implementations of cross-process DOM
+   * APIs, like so
+   *
+   *   recvFooRequest: function(message) {
+   *     if (!message.target.assertPermission("foo")) {
+   *       return false;
+   *     }
+   *     // service foo request
+   *
+   * This interface only returns meaningful data when our content is
+   * in a separate process.  If it shares the same OS process as us,
+   * then applying this permission check doesn't add any security,
+   * though it doesn't hurt anything either.
+   *
+   * Note: If the remote content process does *not* have |aPermission|,
+   * it will be killed as a precaution.
+   */
+  boolean assertPermission(in DOMString aPermission);
+
+};
--- a/content/base/src/WebSocket.cpp
+++ b/content/base/src/WebSocket.cpp
@@ -1259,17 +1259,17 @@ WebSocket::Send(nsIDOMBlob* aData,
 
   uint64_t msgLength;
   rv = aData->GetSize(&msgLength);
   if (NS_FAILED(rv)) {
     aRv.Throw(rv);
     return;
   }
 
-  if (msgLength > PR_UINT32_MAX) {
+  if (msgLength > UINT32_MAX) {
     aRv.Throw(NS_ERROR_FILE_TOO_BIG);
     return;
   }
 
   Send(msgStream, EmptyCString(), msgLength, true, aRv);
 }
 
 void
--- a/content/base/src/nsAttrValue.h
+++ b/content/base/src/nsAttrValue.h
@@ -274,29 +274,29 @@ public:
 
   /**
    * Parse a string value into an integer.
    *
    * @param aString the string to parse
    * @return whether the value could be parsed
    */
   bool ParseIntValue(const nsAString& aString) {
-    return ParseIntWithBounds(aString, PR_INT32_MIN, PR_INT32_MAX);
+    return ParseIntWithBounds(aString, INT32_MIN, INT32_MAX);
   }
 
   /**
    * Parse a string value into an integer with minimum value and maximum value.
    *
    * @param aString the string to parse
    * @param aMin the minimum value (if value is less it will be bumped up)
    * @param aMax the maximum value (if value is greater it will be chopped down)
    * @return whether the value could be parsed
    */
   bool ParseIntWithBounds(const nsAString& aString, int32_t aMin,
-                            int32_t aMax = PR_INT32_MAX);
+                            int32_t aMax = INT32_MAX);
 
   /**
    * Parse a string value into a non-negative integer.
    * This method follows the rules for parsing non-negative integer from:
    * http://dev.w3.org/html5/spec/infrastructure.html#rules-for-parsing-non-negative-integers
    *
    * @param  aString the string to parse
    * @return whether the value is valid
--- a/content/base/src/nsCCUncollectableMarker.cpp
+++ b/content/base/src/nsCCUncollectableMarker.cpp
@@ -115,21 +115,21 @@ MarkMessageManagers()
       nsCOMPtr<nsIMessageListenerManager> childMM;
       windowMM->GetChildAt(j, getter_AddRefs(childMM));
       if (!childMM) {
         continue;
       }
       nsCOMPtr<nsIMessageSender> tabMM = do_QueryInterface(childMM);
       tabMM->MarkForCC();
       //XXX hack warning, but works, since we know that
-      //    callback data is frameloader.
-      void* cb = static_cast<nsFrameMessageManager*>(tabMM.get())->
-        GetCallbackData();
-      nsFrameLoader* fl = static_cast<nsFrameLoader*>(cb);
-      if (fl) {
+      //    callback is frameloader.
+      mozilla::dom::ipc::MessageManagerCallback* cb =
+        static_cast<nsFrameMessageManager*>(tabMM.get())->GetCallback();
+      if (cb) {
+        nsFrameLoader* fl = static_cast<nsFrameLoader*>(cb);
         nsIDOMEventTarget* et = fl->GetTabChildGlobalAsEventTarget();
         if (!et) {
           continue;
         }
         static_cast<nsInProcessTabChildGlobal*>(et)->MarkForCC();
         nsEventListenerManager* elm = et->GetListenerManager(false);
         if (elm) {
           elm->UnmarkGrayJSListeners();
--- a/content/base/src/nsContentList.cpp
+++ b/content/base/src/nsContentList.cpp
@@ -572,17 +572,17 @@ nsContentList::Item(uint32_t aIndex, boo
     nsIDocument* doc = mRootNode->GetCurrentDoc();
     if (doc) {
       // Flush pending content changes Bug 4891.
       doc->FlushPendingNotifications(Flush_ContentAndNotify);
     }
   }
 
   if (mState != LIST_UP_TO_DATE)
-    PopulateSelf(NS_MIN(aIndex, PR_UINT32_MAX - 1) + 1);
+    PopulateSelf(NS_MIN(aIndex, UINT32_MAX - 1) + 1);
 
   ASSERT_IN_SYNC;
   NS_ASSERTION(!mRootNode || mState != LIST_DIRTY,
                "PopulateSelf left the list in a dirty (useless) state!");
 
   return mElements.SafeElementAt(aIndex);
 }
 
--- a/content/base/src/nsContentList.h
+++ b/content/base/src/nsContentList.h
@@ -23,17 +23,17 @@
 #include "nsINameSpaceManager.h"
 #include "nsCycleCollectionParticipant.h"
 #include "nsWrapperCache.h"
 #include "nsHashKeys.h"
 #include "mozilla/HashFunctions.h"
 
 // Magic namespace id that means "match all namespaces".  This is
 // negative so it won't collide with actual namespace constants.
-#define kNameSpaceID_Wildcard PR_INT32_MIN
+#define kNameSpaceID_Wildcard INT32_MIN
 
 // This is a callback function type that can be used to implement an
 // arbitrary matching algorithm.  aContent is the content that may
 // match the list, while aNamespaceID, aAtom, and aData are whatever
 // was passed to the list's constructor.
 typedef bool (*nsContentListMatchFunc)(nsIContent* aContent,
                                          int32_t aNamespaceID,
                                          nsIAtom* aAtom,
--- a/content/base/src/nsContentUtils.cpp
+++ b/content/base/src/nsContentUtils.cpp
@@ -123,16 +123,17 @@ static NS_DEFINE_CID(kXTFServiceCID, NS_
 #include "nsIWebNavigation.h"
 #include "nsILoadContext.h"
 #include "nsTextFragment.h"
 #include "mozilla/Selection.h"
 #include "nsSVGUtils.h"
 #include "nsISVGChildFrame.h"
 #include "nsRenderingContext.h"
 #include "gfxSVGGlyphs.h"
+#include "mozilla/dom/EncodingUtils.h"
 
 #ifdef IBMBIDI
 #include "nsIBidiKeyboard.h"
 #endif
 #include "nsCycleCollectionParticipant.h"
 
 // for ReportToConsole
 #include "nsIStringBundle.h"
@@ -1522,16 +1523,17 @@ nsContentUtils::Shutdown()
   sOSText = nullptr;
   delete sAltText;  
   sAltText = nullptr;
   delete sModifierSeparator;
   sModifierSeparator = nullptr;
 
   NS_IF_RELEASE(sSameOriginChecker);
   
+  EncodingUtils::Shutdown();
   nsTextEditorState::ShutDown();
 }
 
 // static
 bool
 nsContentUtils::CallerHasUniversalXPConnect()
 {
   bool hasCap;
--- a/content/base/src/nsDOMFile.cpp
+++ b/content/base/src/nsDOMFile.cpp
@@ -648,17 +648,17 @@ nsDOMMemoryFile::CreateSlice(uint64_t aS
   nsCOMPtr<nsIDOMBlob> t =
     new nsDOMMemoryFile(this, aStart, aLength, aContentType);
   return t.forget();
 }
 
 NS_IMETHODIMP
 nsDOMMemoryFile::GetInternalStream(nsIInputStream **aStream)
 {
-  if (mLength > PR_INT32_MAX)
+  if (mLength > INT32_MAX)
     return NS_ERROR_FAILURE;
 
   return DataOwnerAdapter::Create(mDataOwner, mStart, mLength, aStream);
 }
 
 ////////////////////////////////////////////////////////////////////////////
 // nsDOMFileList implementation
 
--- a/content/base/src/nsDOMFileReader.cpp
+++ b/content/base/src/nsDOMFileReader.cpp
@@ -289,17 +289,17 @@ nsDOMFileReader::DoOnDataAvailable(nsIRe
                                    uint64_t aOffset,
                                    uint32_t aCount)
 {
   if (mDataFormat == FILE_AS_BINARY) {
     //Continuously update our binary string as data comes in
     NS_ASSERTION(mResult.Length() == aOffset,
                  "unexpected mResult length");
     uint32_t oldLen = mResult.Length();
-    if (uint64_t(oldLen) + aCount > PR_UINT32_MAX)
+    if (uint64_t(oldLen) + aCount > UINT32_MAX)
       return NS_ERROR_OUT_OF_MEMORY;
 
     PRUnichar *buf = nullptr;
     mResult.GetMutableData(&buf, oldLen + aCount, fallible_t());
     NS_ENSURE_TRUE(buf, NS_ERROR_OUT_OF_MEMORY);
 
     uint32_t bytesRead = 0;
     aInputStream->ReadSegments(ReadFuncBinaryString, buf + oldLen, aCount,
@@ -309,17 +309,17 @@ nsDOMFileReader::DoOnDataAvailable(nsIRe
   else if (mDataFormat == FILE_AS_ARRAYBUFFER) {
     uint32_t bytesRead = 0;
     aInputStream->Read((char*)JS_GetArrayBufferData(mResultArrayBuffer, NULL) + aOffset,
                        aCount, &bytesRead);
     NS_ASSERTION(bytesRead == aCount, "failed to read data");
   }
   else {
     //Update memory buffer to reflect the contents of the file
-    if (aOffset + aCount > PR_UINT32_MAX) {
+    if (aOffset + aCount > UINT32_MAX) {
       // PR_Realloc doesn't support over 4GB memory size even if 64-bit OS
       return NS_ERROR_OUT_OF_MEMORY;
     }
     mFileData = (char *)PR_Realloc(mFileData, aOffset + aCount);
     NS_ENSURE_TRUE(mFileData, NS_ERROR_OUT_OF_MEMORY);
 
     uint32_t bytesRead = 0;
     aInputStream->Read(mFileData + aOffset, aCount, &bytesRead);
--- a/content/base/src/nsDocument.cpp
+++ b/content/base/src/nsDocument.cpp
@@ -8233,17 +8233,17 @@ nsIDocument::CreateStaticClone(nsISuppor
   mCreatingStaticClone = false;
   return clonedDoc.forget();
 }
 
 nsresult
 nsIDocument::ScheduleFrameRequestCallback(nsIFrameRequestCallback* aCallback,
                                           int32_t *aHandle)
 {
-  if (mFrameRequestCallbackCounter == PR_INT32_MAX) {
+  if (mFrameRequestCallbackCounter == INT32_MAX) {
     // Can't increment without overflowing; bail out
     return NS_ERROR_NOT_AVAILABLE;
   }
   int32_t newHandle = ++mFrameRequestCallbackCounter;
 
   bool alreadyRegistered = !mFrameRequestCallbacks.IsEmpty();
   DebugOnly<FrameRequest*> request =
     mFrameRequestCallbacks.AppendElement(FrameRequest(aCallback, newHandle));
--- a/content/base/src/nsFrameLoader.cpp
+++ b/content/base/src/nsFrameLoader.cpp
@@ -71,16 +71,17 @@
 
 #include "nsThreadUtils.h"
 
 #include "nsIDOMChromeWindow.h"
 #include "nsInProcessTabChildGlobal.h"
 
 #include "Layers.h"
 
+#include "AppProcessPermissions.h"
 #include "ContentParent.h"
 #include "TabParent.h"
 #include "mozilla/GuardObjects.h"
 #include "mozilla/Preferences.h"
 #include "mozilla/unused.h"
 #include "mozilla/dom/Element.h"
 #include "mozilla/layout/RenderFrameParent.h"
 #include "nsIAppsService.h"
@@ -92,16 +93,17 @@
 #include "mozilla/dom/StructuredCloneUtils.h"
 
 #ifdef MOZ_XUL
 #include "nsXULPopupManager.h"
 #endif
 
 using namespace mozilla;
 using namespace mozilla::dom;
+using namespace mozilla::dom::ipc;
 using namespace mozilla::layers;
 using namespace mozilla::layout;
 typedef FrameMetrics::ViewID ViewID;
 
 class nsAsyncDocShellDestroyer : public nsRunnable
 {
 public:
   nsAsyncDocShellDestroyer(nsIDocShell* aDocShell)
@@ -115,24 +117,16 @@ public:
     if (base_win) {
       base_win->Destroy();
     }
     return NS_OK;
   }
   nsRefPtr<nsIDocShell> mDocShell;
 };
 
-static void InvalidateFrame(nsIFrame* aFrame, uint32_t aFlags)
-{
-  if (!aFrame)
-    return;
-  nsRect rect = nsRect(nsPoint(0, 0), aFrame->GetRect().Size());
-  aFrame->InvalidateWithFlags(rect, aFlags);
-}
-
 NS_IMPL_ISUPPORTS1(nsContentView, nsIContentView)
 
 bool
 nsContentView::IsRoot() const
 {
   return mScrollId == FrameMetrics::ROOT_SCROLL_ID;
 }
 
@@ -157,23 +151,16 @@ nsContentView::Update(const ViewConfig& 
       return NS_ERROR_NOT_AVAILABLE;
     }
   }
 
   if (RenderFrameParent* rfp = mFrameLoader->GetCurrentRemoteFrame()) {
     rfp->ContentViewScaleChanged(this);
   }
 
-  // XXX could be clever here and compute a smaller invalidation
-  // rect
-  // NB: we pass INVALIDATE_NO_THEBES_LAYERS here to keep view
-  // semantics the same for both in-process and out-of-process
-  // <browser>.  This is just a transform of the layer subtree in
-  // both.
-  InvalidateFrame(mFrameLoader->GetPrimaryFrameOfOwningContent(), nsIFrame::INVALIDATE_NO_THEBES_LAYERS);
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsContentView::ScrollTo(float aXpx, float aYpx)
 {
   ViewConfig config(mConfig);
   config.mScrollOffset = nsPoint(nsPresContext::CSSPixelsToAppUnits(aXpx),
@@ -1252,23 +1239,23 @@ nsFrameLoader::SwapWithOtherLoader(nsFra
   JSContext* thisCx =
     mMessageManager ? mMessageManager->GetJSContext() : nullptr;
   JSContext* otherCx = 
     aOther->mMessageManager ? aOther->mMessageManager->GetJSContext() : nullptr;
   if (mMessageManager) {
     mMessageManager->RemoveFromParent();
     mMessageManager->SetJSContext(otherCx);
     mMessageManager->SetParentManager(otherParentManager);
-    mMessageManager->SetCallbackData(aOther, false);
+    mMessageManager->SetCallback(aOther, false);
   }
   if (aOther->mMessageManager) {
     aOther->mMessageManager->RemoveFromParent();
     aOther->mMessageManager->SetJSContext(thisCx);
     aOther->mMessageManager->SetParentManager(ourParentManager);
-    aOther->mMessageManager->SetCallbackData(this, false);
+    aOther->mMessageManager->SetCallback(this, false);
   }
   mMessageManager.swap(aOther->mMessageManager);
 
   aFirstToSwap.swap(aSecondToSwap);
 
   // Drop any cached content viewers in the two session histories.
   nsCOMPtr<nsISHistoryInternal> ourInternalHistory =
     do_QueryInterface(ourHistory);
@@ -1826,21 +1813,16 @@ nsFrameLoader::GetRenderMode(uint32_t* a
 NS_IMETHODIMP
 nsFrameLoader::SetRenderMode(uint32_t aRenderMode)
 {
   if (aRenderMode == mRenderMode) {
     return NS_OK;
   }
 
   mRenderMode = aRenderMode;
-  // NB: we pass INVALIDATE_NO_THEBES_LAYERS here to keep view
-  // semantics the same for both in-process and out-of-process
-  // <browser>.  This is just a transform of the layer subtree in
-  // both.
-  InvalidateFrame(GetPrimaryFrameOfOwningContent(), nsIFrame::INVALIDATE_NO_THEBES_LAYERS);
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsFrameLoader::GetEventMode(uint32_t* aEventMode)
 {
   *aEventMode = mEventMode;
   return NS_OK;
@@ -1861,17 +1843,17 @@ nsFrameLoader::GetClipSubdocument(bool* 
 }
 
 NS_IMETHODIMP
 nsFrameLoader::SetClipSubdocument(bool aClip)
 {
   mClipSubdocument = aClip;
   nsIFrame* frame = GetPrimaryFrameOfOwningContent();
   if (frame) {
-    InvalidateFrame(frame, 0);
+    frame->InvalidateFrame();
     frame->PresContext()->PresShell()->
       FrameNeedsReflow(frame, nsIPresShell::eResize, NS_FRAME_IS_DIRTY);
     nsSubDocumentFrame* subdocFrame = do_QueryFrame(frame);
     if (subdocFrame) {
       nsIFrame* subdocRootFrame = subdocFrame->GetSubdocumentRootFrame();
       if (subdocRootFrame) {
         nsIFrame* subdocRootScrollFrame = subdocRootFrame->PresContext()->PresShell()->
           GetRootScrollFrame();
@@ -2150,38 +2132,37 @@ nsFrameLoader::CreateStaticClone(nsIFram
   NS_ENSURE_STATE(doc);
   nsCOMPtr<nsIDocument> clonedDoc = doc->CreateStaticClone(dest->mDocShell);
   nsCOMPtr<nsIDOMDocument> clonedDOMDoc = do_QueryInterface(clonedDoc);
 
   viewer->SetDOMDocument(clonedDOMDoc);
   return NS_OK;
 }
 
-bool LoadScript(void* aCallbackData, const nsAString& aURL)
+bool
+nsFrameLoader::DoLoadFrameScript(const nsAString& aURL)
 {
-  mozilla::dom::PBrowserParent* tabParent =
-    static_cast<nsFrameLoader*>(aCallbackData)->GetRemoteBrowser();
+  mozilla::dom::PBrowserParent* tabParent = GetRemoteBrowser();
   if (tabParent) {
     return tabParent->SendLoadRemoteScript(nsString(aURL));
   }
-  nsFrameLoader* fl = static_cast<nsFrameLoader*>(aCallbackData);
   nsRefPtr<nsInProcessTabChildGlobal> tabChild =
-    static_cast<nsInProcessTabChildGlobal*>(fl->GetTabChildGlobalAsEventTarget());
+    static_cast<nsInProcessTabChildGlobal*>(GetTabChildGlobalAsEventTarget());
   if (tabChild) {
     tabChild->LoadFrameScript(aURL);
   }
   return true;
 }
 
 class nsAsyncMessageToChild : public nsRunnable
 {
 public:
   nsAsyncMessageToChild(nsFrameLoader* aFrameLoader,
-                              const nsAString& aMessage,
-                              const StructuredCloneData& aData)
+                        const nsAString& aMessage,
+                        const StructuredCloneData& aData)
     : mFrameLoader(aFrameLoader), mMessage(aMessage)
   {
     if (aData.mDataLength && !mData.copy(aData.mData, aData.mDataLength)) {
       NS_RUNTIMEABORT("OOM");
     }
     mClosure = aData.mClosure;
   }
 
@@ -2204,22 +2185,21 @@ public:
     return NS_OK;
   }
   nsRefPtr<nsFrameLoader> mFrameLoader;
   nsString mMessage;
   JSAutoStructuredCloneBuffer mData;
   StructuredCloneClosure mClosure;
 };
 
-bool SendAsyncMessageToChild(void* aCallbackData,
-                             const nsAString& aMessage,
-                                   const StructuredCloneData& aData)
+bool
+nsFrameLoader::DoSendAsyncMessage(const nsAString& aMessage,
+                                  const StructuredCloneData& aData)
 {
-  PBrowserParent* tabParent =
-    static_cast<nsFrameLoader*>(aCallbackData)->GetRemoteBrowser();
+  PBrowserParent* tabParent = GetRemoteBrowser();
   if (tabParent) {
     ClonedMessageData data;
 
     SerializedStructuredCloneBuffer& buffer = data.data();
     buffer.data = aData.mData;
     buffer.dataLength = aData.mDataLength;
 
     const nsTArray<nsCOMPtr<nsIDOMBlob> >& blobs = aData.mClosure.mBlobs;
@@ -2239,28 +2219,33 @@ bool SendAsyncMessageToChild(void* aCall
 
         blobParents.AppendElement(blobParent);
       }
     }
 
     return tabParent->SendAsyncMessage(nsString(aMessage), data);
   }
 
-  if (static_cast<nsFrameLoader*>(aCallbackData)->mChildMessageManager) {
-    nsRefPtr<nsIRunnable> ev =
-      new nsAsyncMessageToChild(static_cast<nsFrameLoader*>(aCallbackData),
-                                aMessage, aData);
+  if (mChildMessageManager) {
+    nsRefPtr<nsIRunnable> ev = new nsAsyncMessageToChild(this, aMessage, aData);
     NS_DispatchToCurrentThread(ev);
     return true;
   }
 
   // We don't have any targets to send our asynchronous message to.
   return false;
 }
 
+bool
+nsFrameLoader::CheckPermission(const nsAString& aPermission)
+{
+  return AssertAppProcessPermission(GetRemoteBrowser(),
+                                    NS_ConvertUTF16toUTF8(aPermission).get());
+}
+
 NS_IMETHODIMP
 nsFrameLoader::GetMessageManager(nsIMessageSender** aManager)
 {
   EnsureMessageManager();
   if (mMessageManager) {
     CallQueryInterface(mMessageManager, aManager);
   }
   return NS_OK;
@@ -2331,17 +2316,17 @@ nsFrameLoader::EnsureMessageManager()
   }
 
   if (!mIsTopLevelContent && !OwnerIsBrowserFrame() && !mRemoteFrame) {
     return NS_OK;
   }
 
   if (mMessageManager) {
     if (ShouldUseRemoteProcess()) {
-      mMessageManager->SetCallbackData(mRemoteBrowserShown ? this : nullptr);
+      mMessageManager->SetCallback(mRemoteBrowserShown ? this : nullptr);
     }
     return NS_OK;
   }
 
   nsIScriptContext* sctx = mOwnerContent->GetContextForEventHandlers(&rv);
   NS_ENSURE_SUCCESS(rv, rv);
   NS_ENSURE_STATE(sctx);
   JSContext* cx = sctx->GetNativeContext();
@@ -2350,34 +2335,30 @@ nsFrameLoader::EnsureMessageManager()
   nsCOMPtr<nsIDOMChromeWindow> chromeWindow =
     do_QueryInterface(GetOwnerDoc()->GetWindow());
   nsCOMPtr<nsIMessageBroadcaster> parentManager;
   if (chromeWindow) {
     chromeWindow->GetMessageManager(getter_AddRefs(parentManager));
   }
 
   if (ShouldUseRemoteProcess()) {
-    mMessageManager = new nsFrameMessageManager(true, /* aChrome */
-                                                nullptr,
-                                                SendAsyncMessageToChild,
-                                                LoadScript,
-                                                mRemoteBrowserShown ? this : nullptr,
+    mMessageManager = new nsFrameMessageManager(mRemoteBrowserShown ? this : nullptr,
                                                 static_cast<nsFrameMessageManager*>(parentManager.get()),
-                                                cx);
+                                                cx,
+                                                MM_CHROME);
   } else {
-    mMessageManager = new nsFrameMessageManager(true, /* aChrome */
-                                                nullptr,
-                                                SendAsyncMessageToChild,
-                                                LoadScript,
-                                                nullptr,
+    mMessageManager = new nsFrameMessageManager(nullptr,
                                                 static_cast<nsFrameMessageManager*>(parentManager.get()),
-                                                cx);
+                                                cx,
+                                                MM_CHROME);
+
     mChildMessageManager =
       new nsInProcessTabChildGlobal(mDocShell, mOwnerContent, mMessageManager);
-    mMessageManager->SetCallbackData(this);
+    // Force pending frame scripts to be loaded.
+    mMessageManager->SetCallback(this);
   }
   return NS_OK;
 }
 
 nsIDOMEventTarget*
 nsFrameLoader::GetTabChildGlobalAsEventTarget()
 {
   return static_cast<nsInProcessTabChildGlobal*>(mChildMessageManager.get());
--- a/content/base/src/nsFrameLoader.h
+++ b/content/base/src/nsFrameLoader.h
@@ -33,16 +33,17 @@ class nsITabParent;
 class nsIDocShellTreeItem;
 class nsIDocShellTreeOwner;
 class nsIDocShellTreeNode;
 
 namespace mozilla {
 namespace dom {
 class PBrowserParent;
 class TabParent;
+struct StructuredCloneData;
 }
 
 namespace layout {
 class RenderFrameParent;
 }
 }
 
 #ifdef MOZ_WIDGET_GTK2
@@ -135,17 +136,18 @@ private:
 
   ViewID mScrollId;
   ViewConfig mConfig;
 };
 
 
 class nsFrameLoader MOZ_FINAL : public nsIFrameLoader,
                                 public nsIContentViewManager,
-                                public nsStubMutationObserver
+                                public nsStubMutationObserver,
+                                public mozilla::dom::ipc::MessageManagerCallback
 {
   friend class AutoResetInShow;
   typedef mozilla::dom::PBrowserParent PBrowserParent;
   typedef mozilla::dom::TabParent TabParent;
   typedef mozilla::layout::RenderFrameParent RenderFrameParent;
 
 protected:
   nsFrameLoader(mozilla::dom::Element* aOwner, bool aNetworkCreated);
@@ -175,16 +177,25 @@ public:
   NS_HIDDEN_(nsresult) CheckForRecursiveLoad(nsIURI* aURI);
   nsresult ReallyStartLoading();
   void Finalize();
   nsIDocShell* GetExistingDocShell() { return mDocShell; }
   nsIDOMEventTarget* GetTabChildGlobalAsEventTarget();
   nsresult CreateStaticClone(nsIFrameLoader* aDest);
 
   /**
+   * MessageManagerCallback methods that we override.
+   */
+  virtual bool DoLoadFrameScript(const nsAString& aURL);
+  virtual bool DoSendAsyncMessage(const nsAString& aMessage,
+                                  const mozilla::dom::StructuredCloneData& aData);
+  virtual bool CheckPermission(const nsAString& aPermission);
+
+
+  /**
    * Called from the layout frame associated with this frame loader;
    * this notifies us to hook up with the widget and view.
    */
   bool Show(int32_t marginWidth, int32_t marginHeight,
               int32_t scrollbarPrefX, int32_t scrollbarPrefY,
               nsSubDocumentFrame* frame);
 
   /**
--- a/content/base/src/nsFrameMessageManager.cpp
+++ b/content/base/src/nsFrameMessageManager.cpp
@@ -2,26 +2,28 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "base/basictypes.h"
 
 #include "nsFrameMessageManager.h"
 
+#include "AppProcessPermissions.h"
 #include "ContentChild.h"
 #include "ContentParent.h"
 #include "nsContentUtils.h"
 #include "nsError.h"
 #include "nsIXPConnect.h"
 #include "jsapi.h"
 #include "nsJSUtils.h"
 #include "nsJSPrincipals.h"
 #include "nsNetUtil.h"
 #include "nsScriptLoader.h"
+#include "nsFrameLoader.h"
 #include "nsIJSContextStack.h"
 #include "nsIXULRuntime.h"
 #include "nsIScriptError.h"
 #include "nsIConsoleService.h"
 #include "nsIProtocolHandler.h"
 #include "nsIScriptSecurityManager.h"
 #include "nsIJSRuntimeService.h"
 #include "nsIDOMClassInfo.h"
@@ -34,16 +36,18 @@
 #include <android/log.h>
 #endif
 #ifdef XP_WIN
 #include <windows.h>
 #endif
 
 using namespace mozilla;
 using namespace mozilla::dom;
+using namespace mozilla::dom::ipc;
+
 
 static bool
 IsChromeProcess()
 {
   nsCOMPtr<nsIXULRuntime> rt = do_GetService("@mozilla.org/xre/runtime;1");
   if (!rt)
     return true;
 
@@ -98,16 +102,20 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
   /* nsIContentFrameMessageManager is accessible only in TabChildGlobal. */
   NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIContentFrameMessageManager,
                                      !mChrome && !mIsProcessManager)
 
   /* Frame message managers (non-process message managers) support nsIFrameScriptLoader. */
   NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIFrameScriptLoader,
                                      mChrome && !mIsProcessManager)
 
+  /* Message senders in the chrome process support nsIPermissionChecker. */
+  NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIPermissionChecker,
+                                     mChrome && !mIsBroadcaster)
+
   NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO_CONDITIONAL(ChromeMessageBroadcaster,
                                                    mChrome && mIsBroadcaster)
   NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO_CONDITIONAL(ChromeMessageSender,
                                                    mChrome && !mIsBroadcaster)
 NS_INTERFACE_MAP_END
 
 NS_IMPL_CYCLE_COLLECTING_ADDREF(nsFrameMessageManager)
 NS_IMPL_CYCLE_COLLECTING_RELEASE(nsFrameMessageManager)
@@ -154,28 +162,28 @@ nsFrameMessageManager::RemoveMessageList
 NS_IMETHODIMP
 nsFrameMessageManager::LoadFrameScript(const nsAString& aURL,
                                        bool aAllowDelayedLoad)
 {
   if (aAllowDelayedLoad) {
     if (IsGlobal() || IsWindowLevel()) {
       // Cache for future windows or frames
       mPendingScripts.AppendElement(aURL);
-    } else if (!mCallbackData) {
+    } else if (!mCallback) {
       // We're frame message manager, which isn't connected yet.
       mPendingScripts.AppendElement(aURL);
       return NS_OK;
     }
   }
 
-  if (mCallbackData) {
+  if (mCallback) {
 #ifdef DEBUG_smaug
     printf("Will load %s \n", NS_ConvertUTF16toUTF8(aURL).get());
 #endif
-    NS_ENSURE_TRUE(mLoadScriptCallback(mCallbackData, aURL), NS_ERROR_FAILURE);
+    NS_ENSURE_TRUE(mCallback->DoLoadFrameScript(aURL), NS_ERROR_FAILURE);
   }
 
   for (int32_t i = 0; i < mChildManagers.Count(); ++i) {
     nsRefPtr<nsFrameMessageManager> mm =
       static_cast<nsFrameMessageManager*>(mChildManagers[i]);
     if (mm) {
       // Use false here, so that child managers don't cache the script, which
       // is already cached in the parent.
@@ -237,119 +245,116 @@ nsFrameMessageManager::SendSyncMessage(c
                                        const jsval& aObject,
                                        JSContext* aCx,
                                        uint8_t aArgc,
                                        jsval* aRetval)
 {
   NS_ASSERTION(!IsGlobal(), "Should not call SendSyncMessage in chrome");
   NS_ASSERTION(!IsWindowLevel(), "Should not call SendSyncMessage in chrome");
   NS_ASSERTION(!mParentManager, "Should not have parent manager in content!");
+
   *aRetval = JSVAL_VOID;
-  if (mSyncCallback) {
-    NS_ENSURE_TRUE(mCallbackData, NS_ERROR_NOT_INITIALIZED);
-    StructuredCloneData data;
-    JSAutoStructuredCloneBuffer buffer;
-    if (aArgc >= 2 &&
-        !GetParamsForMessage(aCx, aObject, buffer, data.mClosure)) {
-      return NS_ERROR_DOM_DATA_CLONE_ERR;
-    }
-    data.mData = buffer.data();
-    data.mDataLength = buffer.nbytes();
+  NS_ENSURE_TRUE(mCallback, NS_ERROR_NOT_INITIALIZED);
 
-    InfallibleTArray<nsString> retval;
-    if (mSyncCallback(mCallbackData, aMessageName, data, &retval)) {
-      JSAutoRequest ar(aCx);
-      uint32_t len = retval.Length();
-      JSObject* dataArray = JS_NewArrayObject(aCx, len, NULL);
-      NS_ENSURE_TRUE(dataArray, NS_ERROR_OUT_OF_MEMORY);
+  StructuredCloneData data;
+  JSAutoStructuredCloneBuffer buffer;
+  if (aArgc >= 2 &&
+      !GetParamsForMessage(aCx, aObject, buffer, data.mClosure)) {
+    return NS_ERROR_DOM_DATA_CLONE_ERR;
+  }
+  data.mData = buffer.data();
+  data.mDataLength = buffer.nbytes();
 
-      for (uint32_t i = 0; i < len; ++i) {
-        if (retval[i].IsEmpty()) {
-          continue;
-        }
+  InfallibleTArray<nsString> retval;
+  if (mCallback->DoSendSyncMessage(aMessageName, data, &retval)) {
+    JSAutoRequest ar(aCx);
+    uint32_t len = retval.Length();
+    JSObject* dataArray = JS_NewArrayObject(aCx, len, NULL);
+    NS_ENSURE_TRUE(dataArray, NS_ERROR_OUT_OF_MEMORY);
 
-        jsval ret = JSVAL_VOID;
-        if (!JS_ParseJSON(aCx, static_cast<const jschar*>(retval[i].get()),
-                          retval[i].Length(), &ret)) {
-          return NS_ERROR_UNEXPECTED;
-        }
-        NS_ENSURE_TRUE(JS_SetElement(aCx, dataArray, i, &ret), NS_ERROR_OUT_OF_MEMORY);
+    for (uint32_t i = 0; i < len; ++i) {
+      if (retval[i].IsEmpty()) {
+        continue;
       }
 
-      *aRetval = OBJECT_TO_JSVAL(dataArray);
+      jsval ret = JSVAL_VOID;
+      if (!JS_ParseJSON(aCx, static_cast<const jschar*>(retval[i].get()),
+                        retval[i].Length(), &ret)) {
+        return NS_ERROR_UNEXPECTED;
+      }
+      NS_ENSURE_TRUE(JS_SetElement(aCx, dataArray, i, &ret), NS_ERROR_OUT_OF_MEMORY);
     }
+
+    *aRetval = OBJECT_TO_JSVAL(dataArray);
   }
   return NS_OK;
 }
 
 nsresult
 nsFrameMessageManager::DispatchAsyncMessageInternal(const nsAString& aMessage,
-                                                    const StructuredCloneData& aData,
-                                                    ShouldBroadcast aBroadcast)
+                                                    const StructuredCloneData& aData)
 {
-  if (mAsyncCallback) {
-    NS_ENSURE_TRUE(mCallbackData, NS_ERROR_NOT_INITIALIZED);
-
-    if (!mAsyncCallback(mCallbackData, aMessage, aData)) {
-      return NS_ERROR_FAILURE;
-    }
-  }
-  if (aBroadcast == BROADCAST) {
+  if (mIsBroadcaster) {
     int32_t len = mChildManagers.Count();
     for (int32_t i = 0; i < len; ++i) {
       static_cast<nsFrameMessageManager*>(mChildManagers[i])->
-         DispatchAsyncMessageInternal(aMessage, aData, aBroadcast);
+         DispatchAsyncMessageInternal(aMessage, aData);
     }
+    return NS_OK;
+  }
+
+  NS_ENSURE_TRUE(mCallback, NS_ERROR_NOT_INITIALIZED);
+  if (!mCallback->DoSendAsyncMessage(aMessage, aData)) {
+    return NS_ERROR_FAILURE;
   }
   return NS_OK;
 }
 
 nsresult
 nsFrameMessageManager::DispatchAsyncMessage(const nsAString& aMessageName,
                                             const jsval& aObject,
                                             JSContext* aCx,
-                                            uint8_t aArgc,
-                                            ShouldBroadcast aBroadcast)
+                                            uint8_t aArgc)
 {
   StructuredCloneData data;
   JSAutoStructuredCloneBuffer buffer;
 
   if (aArgc >= 2 &&
       !GetParamsForMessage(aCx, aObject, buffer, data.mClosure)) {
     return NS_ERROR_DOM_DATA_CLONE_ERR;
   }
 
   data.mData = buffer.data();
   data.mDataLength = buffer.nbytes();
 
-  return DispatchAsyncMessageInternal(aMessageName, data, aBroadcast);
+  return DispatchAsyncMessageInternal(aMessageName, data);
 }
 
 
 // nsIMessageSender
 
 NS_IMETHODIMP
 nsFrameMessageManager::SendAsyncMessage(const nsAString& aMessageName,
                                         const jsval& aObject,
                                         JSContext* aCx,
                                         uint8_t aArgc)
 {
-  return DispatchAsyncMessage(aMessageName, aObject, aCx, aArgc, DONT_BROADCAST);
+  return DispatchAsyncMessage(aMessageName, aObject, aCx, aArgc);
 }
 
 
 // nsIMessageBroadcaster
 
 NS_IMETHODIMP
 nsFrameMessageManager::BroadcastAsyncMessage(const nsAString& aMessageName,
                                              const jsval& aObject,
                                              JSContext* aCx,
                                              uint8_t aArgc)
 {
-  return DispatchAsyncMessage(aMessageName, aObject, aCx, aArgc, BROADCAST);
+  return DispatchAsyncMessage(aMessageName, aObject, aCx, aArgc);
 }
 
 NS_IMETHODIMP
 nsFrameMessageManager::GetChildCount(uint32_t* aChildCount)
 {
   *aChildCount = static_cast<uint32_t>(mChildManagers.Count()); 
   return NS_OK;
 }
@@ -413,16 +418,33 @@ nsFrameMessageManager::Btoa(const nsAStr
 
 NS_IMETHODIMP
 nsFrameMessageManager::Atob(const nsAString& aAsciiString,
                             nsAString& aBinaryData)
 {
   return NS_OK;
 }
 
+// nsIPermissionChecker
+
+NS_IMETHODIMP
+nsFrameMessageManager::AssertPermission(const nsAString& aPermission, bool* aHasPermission)
+{
+  *aHasPermission = false;
+
+  // This API is only supported for message senders in the chrome process.
+  if (!mChrome || mIsBroadcaster) {
+    return NS_ERROR_NOT_IMPLEMENTED;
+  }
+  if (!mCallback) {
+    return NS_ERROR_NOT_AVAILABLE;
+  }
+  *aHasPermission = mCallback->CheckPermission(aPermission);
+  return NS_OK;
+}
 
 class MMListenerRemover
 {
 public:
   MMListenerRemover(nsFrameMessageManager* aMM)
     : mWasHandlingMessage(aMM->mHandlingMessage)
     , mMM(aMM)
   {
@@ -605,20 +627,25 @@ nsFrameMessageManager::AddChildManager(n
     }
     for (uint32_t i = 0; i < mPendingScripts.Length(); ++i) {
       aManager->LoadFrameScript(mPendingScripts[i], false);
     }
   }
 }
 
 void
-nsFrameMessageManager::SetCallbackData(void* aData, bool aLoadScripts)
+nsFrameMessageManager::SetCallback(MessageManagerCallback* aCallback, bool aLoadScripts)
 {
-  if (aData && mCallbackData != aData) {
-    mCallbackData = aData;
+  NS_ASSERTION(!mIsBroadcaster || !mCallback,
+               "Broadcasters cannot have callbacks!");
+  if (aCallback && mCallback != aCallback) {
+    mCallback = aCallback;
+    if (mOwnsCallback) {
+      mOwnedCallback = aCallback;
+    }
     // First load global scripts by adding this to parent manager.
     if (mParentManager) {
       mParentManager->AddChildManager(this, aLoadScripts);
     }
     if (aLoadScripts) {
       for (uint32_t i = 0; i < mPendingScripts.Length(); ++i) {
         LoadFrameScript(mPendingScripts[i], false);
       }
@@ -628,50 +655,45 @@ nsFrameMessageManager::SetCallbackData(v
 
 void
 nsFrameMessageManager::RemoveFromParent()
 {
   if (mParentManager) {
     mParentManager->RemoveChildManager(this);
   }
   mParentManager = nullptr;
-  mCallbackData = nullptr;
+  mCallback = nullptr;
+  mOwnedCallback = nullptr;
   mContext = nullptr;
 }
 
 void
 nsFrameMessageManager::Disconnect(bool aRemoveFromParent)
 {
   if (mParentManager && aRemoveFromParent) {
     mParentManager->RemoveChildManager(this);
   }
   mDisconnected = true;
   mParentManager = nullptr;
-  mCallbackData = nullptr;
+  mCallback = nullptr;
+  mOwnedCallback = nullptr;
   mContext = nullptr;
   if (!mHandlingMessage) {
     mListeners.Clear();
   }
 }
 
 nsresult
 NS_NewGlobalMessageManager(nsIMessageBroadcaster** aResult)
 {
   NS_ENSURE_TRUE(IsChromeProcess(), NS_ERROR_NOT_AVAILABLE);
-  nsFrameMessageManager* mm = new nsFrameMessageManager(true /* aChrome */,
-                                                        nullptr,
-                                                        nullptr,
-                                                        nullptr,
+  nsFrameMessageManager* mm = new nsFrameMessageManager(nullptr,
                                                         nullptr,
                                                         nullptr,
-                                                        nullptr,
-                                                        true /* aGlobal */,
-                                                        false /* aProcessManager */,
-                                                        true /* aBroadcaster */);
-  NS_ENSURE_TRUE(mm, NS_ERROR_OUT_OF_MEMORY);
+                                                        MM_CHROME | MM_GLOBAL | MM_BROADCASTER);
   return CallQueryInterface(mm, aResult);
 }
 
 void
 ContentScriptErrorReporter(JSContext* aCx,
                            const char* aMessage,
                            JSErrorReport* aReport)
 {
@@ -874,21 +896,21 @@ nsFrameScriptExecutor::TryCacheLoadAndCo
     return;
   }
 
   nsCOMPtr<nsIInputStream> input;
   channel->Open(getter_AddRefs(input));
   nsString dataString;
   uint64_t avail64 = 0;
   if (input && NS_SUCCEEDED(input->Available(&avail64)) && avail64) {
-    if (avail64 > PR_UINT32_MAX) {
+    if (avail64 > UINT32_MAX) {
       return;
     }
     nsCString buffer;
-    uint32_t avail = (uint32_t)NS_MIN(avail64, (uint64_t)PR_UINT32_MAX);
+    uint32_t avail = (uint32_t)NS_MIN(avail64, (uint64_t)UINT32_MAX);
     if (NS_FAILED(NS_ReadInputStreamToString(input, buffer, avail))) {
       return;
     }
     nsScriptLoader::ConvertToUTF16(channel, (uint8_t*)buffer.get(), avail,
                                    EmptyString(), nullptr, dataString);
   }
 
   if (!dataString.IsEmpty()) {
@@ -996,46 +1018,16 @@ nsFrameScriptExecutor::Traverse(nsFrameS
 
 NS_IMPL_ISUPPORTS1(nsScriptCacheCleaner, nsIObserver)
 
 nsFrameMessageManager* nsFrameMessageManager::sChildProcessManager = nullptr;
 nsFrameMessageManager* nsFrameMessageManager::sParentProcessManager = nullptr;
 nsFrameMessageManager* nsFrameMessageManager::sSameProcessParentManager = nullptr;
 nsTArray<nsCOMPtr<nsIRunnable> >* nsFrameMessageManager::sPendingSameProcessAsyncMessages = nullptr;
 
-bool SendAsyncMessageToChildProcess(void* aCallbackData,
-                                    const nsAString& aMessage,
-                                    const StructuredCloneData& aData)
-{
-  mozilla::dom::ContentParent* cp =
-    static_cast<mozilla::dom::ContentParent*>(aCallbackData);
-  NS_WARN_IF_FALSE(cp, "No child process!");
-  if (cp) {
-    ClonedMessageData data;
-    SerializedStructuredCloneBuffer& buffer = data.data();
-    buffer.data = aData.mData;
-    buffer.dataLength = aData.mDataLength;
-    const nsTArray<nsCOMPtr<nsIDOMBlob> >& blobs = aData.mClosure.mBlobs;
-    if (!blobs.IsEmpty()) {
-      InfallibleTArray<PBlobParent*>& blobParents = data.blobsParent();
-      uint32_t length = blobs.Length();
-      blobParents.SetCapacity(length);
-      for (uint32_t i = 0; i < length; ++i) {
-        BlobParent* blobParent = cp->GetOrCreateActorForBlob(blobs[i]);
-        if (!blobParent) {
-          return false;
-  }
-        blobParents.AppendElement(blobParent);
-      }
-    }
-
-    return cp->SendAsyncMessage(nsString(aMessage), data);
-  }
-  return true;
-}
 
 class nsAsyncMessageToSameProcessChild : public nsRunnable
 {
 public:
   nsAsyncMessageToSameProcessChild(const nsAString& aMessage,
                                    const StructuredCloneData& aData)
     : mMessage(aMessage)
   {
@@ -1059,34 +1051,74 @@ public:
     }
     return NS_OK;
   }
   nsString mMessage;
   JSAutoStructuredCloneBuffer mData;
   StructuredCloneClosure mClosure;
 };
 
-bool SendAsyncMessageToSameProcessChild(void* aCallbackData,
-                                        const nsAString& aMessage,
-                                        const StructuredCloneData& aData)
+
+/**
+ * Send messages to an imaginary child process in a single-process scenario.
+ */
+class SameParentProcessMessageManagerCallback : public MessageManagerCallback
 {
-  nsRefPtr<nsIRunnable> ev =
-    new nsAsyncMessageToSameProcessChild(aMessage, aData);
-  NS_DispatchToCurrentThread(ev);
-  return true;
-}
+public:
+  SameParentProcessMessageManagerCallback()
+  {
+    MOZ_COUNT_CTOR(SameParentProcessMessageManagerCallback);
+  }
+  virtual ~SameParentProcessMessageManagerCallback()
+  {
+    MOZ_COUNT_DTOR(SameParentProcessMessageManagerCallback);
+  }
+
+  virtual bool DoSendAsyncMessage(const nsAString& aMessage,
+                                  const StructuredCloneData& aData)
+  {
+    nsRefPtr<nsIRunnable> ev =
+      new nsAsyncMessageToSameProcessChild(aMessage, aData);
+    NS_DispatchToCurrentThread(ev);
+    return true;
+  }
+
+  bool CheckPermission(const nsAString& aPermission)
+  {
+    // In a single-process scenario, the child always has all capabilities.
+    return true;
+  }
 
-bool SendSyncMessageToParentProcess(void* aCallbackData,
-                                    const nsAString& aMessage,
-                                    const StructuredCloneData& aData,
-                                    InfallibleTArray<nsString>* aJSONRetVal)
+};
+
+
+/**
+ * Send messages to the parent process.
+ */
+class ChildProcessMessageManagerCallback : public MessageManagerCallback
 {
-  mozilla::dom::ContentChild* cc =
-    mozilla::dom::ContentChild::GetSingleton();
-  if (cc) {
+public:
+  ChildProcessMessageManagerCallback()
+  {
+    MOZ_COUNT_CTOR(ChildProcessMessageManagerCallback);
+  }
+  virtual ~ChildProcessMessageManagerCallback()
+  {
+    MOZ_COUNT_DTOR(ChildProcessMessageManagerCallback);
+  }
+
+  virtual bool DoSendSyncMessage(const nsAString& aMessage,
+                                 const mozilla::dom::StructuredCloneData& aData,
+                                 InfallibleTArray<nsString>* aJSONRetVal)
+  {
+    mozilla::dom::ContentChild* cc =
+      mozilla::dom::ContentChild::GetSingleton();
+    if (!cc) {
+      return true;
+    }
     ClonedMessageData data;
     SerializedStructuredCloneBuffer& buffer = data.data();
     buffer.data = aData.mData;
     buffer.dataLength = aData.mDataLength;
     const nsTArray<nsCOMPtr<nsIDOMBlob> >& blobs = aData.mClosure.mBlobs;
     if (!blobs.IsEmpty()) {
       InfallibleTArray<PBlobChild*>& blobChildList = data.blobsChild();
       uint32_t length = blobs.Length();
@@ -1094,51 +1126,27 @@ bool SendSyncMessageToParentProcess(void
       for (uint32_t i = 0; i < length; ++i) {
         BlobChild* blobChild = cc->GetOrCreateActorForBlob(blobs[i]);
         if (!blobChild) {
           return false;
         }
         blobChildList.AppendElement(blobChild);
       }
     }
-    return
-      cc->SendSyncMessage(nsString(aMessage), data, aJSONRetVal);
+    return cc->SendSyncMessage(nsString(aMessage), data, aJSONRetVal);
   }
-  return true;
-}
 
-bool SendSyncMessageToSameProcessParent(void* aCallbackData,
-                                        const nsAString& aMessage,
-                                        const StructuredCloneData& aData,
-                                        InfallibleTArray<nsString>* aJSONRetVal)
-{
-  nsTArray<nsCOMPtr<nsIRunnable> > asyncMessages;
-  if (nsFrameMessageManager::sPendingSameProcessAsyncMessages) {
-    asyncMessages.SwapElements(*nsFrameMessageManager::sPendingSameProcessAsyncMessages);
-    uint32_t len = asyncMessages.Length();
-    for (uint32_t i = 0; i < len; ++i) {
-      nsCOMPtr<nsIRunnable> async = asyncMessages[i];
-      async->Run();
+  virtual bool DoSendAsyncMessage(const nsAString& aMessage,
+                                  const mozilla::dom::StructuredCloneData& aData)
+  {
+    mozilla::dom::ContentChild* cc =
+      mozilla::dom::ContentChild::GetSingleton();
+    if (!cc) {
+      return true;
     }
-  }
-  if (nsFrameMessageManager::sSameProcessParentManager) {
-    nsRefPtr<nsFrameMessageManager> ppm = nsFrameMessageManager::sSameProcessParentManager;
-    ppm->ReceiveMessage(static_cast<nsIContentFrameMessageManager*>(ppm.get()), aMessage,
-                        true, &aData, nullptr, aJSONRetVal);
-  }
-  return true;
-}
-
-bool SendAsyncMessageToParentProcess(void* aCallbackData,
-                                     const nsAString& aMessage,
-                                          const StructuredCloneData& aData)
-{
-  mozilla::dom::ContentChild* cc =
-    mozilla::dom::ContentChild::GetSingleton();
-  if (cc) {
     ClonedMessageData data;
     SerializedStructuredCloneBuffer& buffer = data.data();
     buffer.data = aData.mData;
     buffer.dataLength = aData.mDataLength;
     const nsTArray<nsCOMPtr<nsIDOMBlob> >& blobs = aData.mClosure.mBlobs;
     if (!blobs.IsEmpty()) {
       InfallibleTArray<PBlobChild*>& blobChildList = data.blobsChild();
       uint32_t length = blobs.Length();
@@ -1148,24 +1156,25 @@ bool SendAsyncMessageToParentProcess(voi
         if (!blobChild) {
           return false;
         }
         blobChildList.AppendElement(blobChild);
       }
     }
     return cc->SendAsyncMessage(nsString(aMessage), data);
   }
-  return true;
-}
+
+};
+
 
 class nsAsyncMessageToSameProcessParent : public nsRunnable
 {
 public:
   nsAsyncMessageToSameProcessParent(const nsAString& aMessage,
-                                         const StructuredCloneData& aData)
+                                    const StructuredCloneData& aData)
     : mMessage(aMessage)
   {
     if (aData.mDataLength && !mData.copy(aData.mData, aData.mDataLength)) {
       NS_RUNTIMEABORT("OOM");
     }
     mClosure = aData.mClosure;
   }
 
@@ -1187,95 +1196,126 @@ public:
      }
      return NS_OK;
   }
   nsString mMessage;
   JSAutoStructuredCloneBuffer mData;
   StructuredCloneClosure mClosure;
 };
 
-bool SendAsyncMessageToSameProcessParent(void* aCallbackData,
-                                              const nsAString& aMessage,
-                                              const StructuredCloneData& aData)
+/**
+ * Send messages to the imaginary parent process in a single-process scenario.
+ */
+class SameChildProcessMessageManagerCallback : public MessageManagerCallback
 {
-  if (!nsFrameMessageManager::sPendingSameProcessAsyncMessages) {
-    nsFrameMessageManager::sPendingSameProcessAsyncMessages = new nsTArray<nsCOMPtr<nsIRunnable> >;
+public:
+  SameChildProcessMessageManagerCallback()
+  {
+    MOZ_COUNT_CTOR(SameChildProcessMessageManagerCallback);
+  }
+  virtual ~SameChildProcessMessageManagerCallback()
+  {
+    MOZ_COUNT_DTOR(SameChildProcessMessageManagerCallback);
   }
-  nsCOMPtr<nsIRunnable> ev =
-    new nsAsyncMessageToSameProcessParent(aMessage, aData);
-  nsFrameMessageManager::sPendingSameProcessAsyncMessages->AppendElement(ev);
-  NS_DispatchToCurrentThread(ev);
-  return true;
-}
+
+  virtual bool DoSendSyncMessage(const nsAString& aMessage,
+                                 const mozilla::dom::StructuredCloneData& aData,
+                                 InfallibleTArray<nsString>* aJSONRetVal)
+  {
+    nsTArray<nsCOMPtr<nsIRunnable> > asyncMessages;
+    if (nsFrameMessageManager::sPendingSameProcessAsyncMessages) {
+      asyncMessages.SwapElements(*nsFrameMessageManager::sPendingSameProcessAsyncMessages);
+      uint32_t len = asyncMessages.Length();
+      for (uint32_t i = 0; i < len; ++i) {
+        nsCOMPtr<nsIRunnable> async = asyncMessages[i];
+        async->Run();
+      }
+    }
+    if (nsFrameMessageManager::sSameProcessParentManager) {
+      nsRefPtr<nsFrameMessageManager> ppm = nsFrameMessageManager::sSameProcessParentManager;
+      ppm->ReceiveMessage(static_cast<nsIContentFrameMessageManager*>(ppm.get()), aMessage,
+                          true, &aData, nullptr, aJSONRetVal);
+    }
+    return true;
+  }
+
+  virtual bool DoSendAsyncMessage(const nsAString& aMessage,
+                                  const mozilla::dom::StructuredCloneData& aData)
+  {
+    if (!nsFrameMessageManager::sPendingSameProcessAsyncMessages) {
+      nsFrameMessageManager::sPendingSameProcessAsyncMessages = new nsTArray<nsCOMPtr<nsIRunnable> >;
+    }
+    nsCOMPtr<nsIRunnable> ev =
+      new nsAsyncMessageToSameProcessParent(aMessage, aData);
+    nsFrameMessageManager::sPendingSameProcessAsyncMessages->AppendElement(ev);
+    NS_DispatchToCurrentThread(ev);
+    return true;
+  }
+
+};
+
 
 // This creates the global parent process message manager.
 nsresult
 NS_NewParentProcessMessageManager(nsIMessageBroadcaster** aResult)
 {
   NS_ASSERTION(!nsFrameMessageManager::sParentProcessManager,
                "Re-creating sParentProcessManager");
   NS_ENSURE_TRUE(IsChromeProcess(), NS_ERROR_NOT_AVAILABLE);
-  nsRefPtr<nsFrameMessageManager> mm = new nsFrameMessageManager(true /* aChrome */,
-                                                                 nullptr,
-                                                                 nullptr,
+  nsRefPtr<nsFrameMessageManager> mm = new nsFrameMessageManager(nullptr,
                                                                  nullptr,
                                                                  nullptr,
-                                                                 nullptr,
-                                                                 nullptr,
-                                                                 false, /* aGlobal */
-                                                                 true /* aProcessManager */,
-                                                                 true /* aBroadcaster */);
+                                                                 MM_CHROME | MM_PROCESSMANAGER | MM_BROADCASTER);
   NS_ENSURE_TRUE(mm, NS_ERROR_OUT_OF_MEMORY);
   nsFrameMessageManager::sParentProcessManager = mm;
   nsFrameMessageManager::NewProcessMessageManager(nullptr); // Create same process message manager.
   return CallQueryInterface(mm, aResult);
 }
 
+
 nsFrameMessageManager*
 nsFrameMessageManager::NewProcessMessageManager(mozilla::dom::ContentParent* aProcess)
 {
   if (!nsFrameMessageManager::sParentProcessManager) {
      nsCOMPtr<nsIMessageBroadcaster> dummy;
      NS_NewParentProcessMessageManager(getter_AddRefs(dummy));
   }
 
-  nsFrameMessageManager* mm = new nsFrameMessageManager(true /* aChrome */,
-                                                        nullptr,
-                                                        aProcess ? SendAsyncMessageToChildProcess
-                                                                 : SendAsyncMessageToSameProcessChild,
-                                                        nullptr,
-                                                        aProcess ? static_cast<void*>(aProcess)
-                                                                 : static_cast<void*>(&nsFrameMessageManager::sChildProcessManager),
-                                                        nsFrameMessageManager::sParentProcessManager,
-                                                        nullptr,
-                                                        false, /* aGlobal */
-                                                        true /* aProcessManager */);
-  if (!aProcess) {
+  nsFrameMessageManager* mm;
+  if (aProcess) {
+    mm = new nsFrameMessageManager(aProcess,
+                                   nsFrameMessageManager::sParentProcessManager,
+                                   nullptr,
+                                   MM_CHROME | MM_PROCESSMANAGER);
+  } else {
+    mm = new nsFrameMessageManager(new SameParentProcessMessageManagerCallback(),
+                                   nsFrameMessageManager::sParentProcessManager,
+                                   nullptr,
+                                   MM_CHROME | MM_PROCESSMANAGER | MM_OWNSCALLBACK);
     sSameProcessParentManager = mm;
   }
   return mm;
 }
 
 nsresult
 NS_NewChildProcessMessageManager(nsISyncMessageSender** aResult)
 {
   NS_ASSERTION(!nsFrameMessageManager::sChildProcessManager,
                "Re-creating sChildProcessManager");
-  bool isChrome = IsChromeProcess();
-  nsFrameMessageManager* mm = new nsFrameMessageManager(false /* aChrome */,
-                                                        isChrome ? SendSyncMessageToSameProcessParent
-                                                                 : SendSyncMessageToParentProcess,
-                                                        isChrome ? SendAsyncMessageToSameProcessParent
-                                                                 : SendAsyncMessageToParentProcess,
-                                                        nullptr,
-                                                        &nsFrameMessageManager::sChildProcessManager,
+
+  MessageManagerCallback* cb;
+  if (IsChromeProcess()) {
+    cb = new SameChildProcessMessageManagerCallback();
+  } else {
+    cb = new ChildProcessMessageManagerCallback();
+  }
+  nsFrameMessageManager* mm = new nsFrameMessageManager(cb,
                                                         nullptr,
                                                         nullptr,
-                                                        false /* aGlobal */,
-                                                        true /* aProcessManager */);
+                                                        MM_PROCESSMANAGER | MM_OWNSCALLBACK);
   NS_ENSURE_TRUE(mm, NS_ERROR_OUT_OF_MEMORY);
   nsFrameMessageManager::sChildProcessManager = mm;
   return CallQueryInterface(mm, aResult);
 }
 
 bool
 nsFrameMessageManager::MarkForCC()
 {
--- a/content/base/src/nsFrameMessageManager.h
+++ b/content/base/src/nsFrameMessageManager.h
@@ -19,79 +19,112 @@
 #include "nsDataHashtable.h"
 #include "mozilla/Services.h"
 #include "nsIObserverService.h"
 #include "nsThreadUtils.h"
 #include "mozilla/Attributes.h"
 
 namespace mozilla {
 namespace dom {
+
 class ContentParent;
 struct StructuredCloneData;
-}
-}
+
+namespace ipc {
+
+enum MessageManagerFlags {
+  MM_CHILD = 0,
+  MM_CHROME = 1,
+  MM_GLOBAL = 2,
+  MM_PROCESSMANAGER = 4,
+  MM_BROADCASTER = 8,
+  MM_OWNSCALLBACK = 16
+};
+
+class MessageManagerCallback
+{
+public:
+  virtual ~MessageManagerCallback() {}
+
+  virtual bool DoLoadFrameScript(const nsAString& aURL)
+  {
+    return true;
+  }
+
+  virtual bool DoSendSyncMessage(const nsAString& aMessage,
+                                 const mozilla::dom::StructuredCloneData& aData,
+                                 InfallibleTArray<nsString>* aJSONRetVal)
+  {
+    return true;
+  }
+
+  virtual bool DoSendAsyncMessage(const nsAString& aMessage,
+                                  const mozilla::dom::StructuredCloneData& aData)
+  {
+    return true;
+  }
+
+  virtual bool CheckPermission(const nsAString& aPermission)
+  {
+    return false;
+  }
+};
+
+} // namespace ipc
+} // namespace dom
+} // namespace mozilla
 
 class nsAXPCNativeCallContext;
 struct JSContext;
 struct JSObject;
 
 struct nsMessageListenerInfo
 {
   nsCOMPtr<nsIMessageListener> mListener;
   nsCOMPtr<nsIAtom> mMessage;
 };
 
-typedef bool (*nsLoadScriptCallback)(void* aCallbackData, const nsAString& aURL);
-typedef bool (*nsSyncMessageCallback)(void* aCallbackData,
-                                      const nsAString& aMessage,
-                                      const mozilla::dom::StructuredCloneData& aData,
-                                      InfallibleTArray<nsString>* aJSONRetVal);
-typedef bool (*nsAsyncMessageCallback)(void* aCallbackData,
-                                       const nsAString& aMessage,
-                                             const mozilla::dom::StructuredCloneData& aData);
 
 class nsFrameMessageManager MOZ_FINAL : public nsIContentFrameMessageManager,
                                         public nsIMessageBroadcaster,
-                                        public nsIFrameScriptLoader
+                                        public nsIFrameScriptLoader,
+                                        public nsIPermissionChecker
 {
   typedef mozilla::dom::StructuredCloneData StructuredCloneData;
 public:
-  nsFrameMessageManager(bool aChrome,
-                        nsSyncMessageCallback aSyncCallback,
-                        nsAsyncMessageCallback aAsyncCallback,
-                        nsLoadScriptCallback aLoadScriptCallback,
-                        void* aCallbackData,
+  nsFrameMessageManager(mozilla::dom::ipc::MessageManagerCallback* aCallback,
                         nsFrameMessageManager* aParentManager,
                         JSContext* aContext,
-                        bool aGlobal = false,
-                        bool aProcessManager = false,
-                        bool aBroadcaster = false)
-  : mChrome(aChrome),
-    mGlobal(aGlobal),
-    mIsProcessManager(aProcessManager),
-    mIsBroadcaster(aBroadcaster),
+                        /* mozilla::dom::ipc::MessageManagerFlags */ uint32_t aFlags)
+  : mChrome(!!(aFlags & mozilla::dom::ipc::MM_CHROME)),
+    mGlobal(!!(aFlags & mozilla::dom::ipc::MM_GLOBAL)),
+    mIsProcessManager(!!(aFlags & mozilla::dom::ipc::MM_PROCESSMANAGER)),
+    mIsBroadcaster(!!(aFlags & mozilla::dom::ipc::MM_BROADCASTER)),
+    mOwnsCallback(!!(aFlags & mozilla::dom::ipc::MM_OWNSCALLBACK)),
     mHandlingMessage(false),
     mDisconnected(false),
+    mCallback(aCallback),
     mParentManager(aParentManager),
-    mSyncCallback(aSyncCallback),
-    mAsyncCallback(aAsyncCallback),
-    mLoadScriptCallback(aLoadScriptCallback),
-    mCallbackData(aCallbackData),
     mContext(aContext)
   {
-    NS_ASSERTION(mContext || (aChrome && !aParentManager) || aProcessManager,
+    NS_ASSERTION(mContext || (mChrome && !mParentManager) || mIsProcessManager,
                  "Should have mContext in non-global/non-process manager!");
-    NS_ASSERTION(aChrome || !aParentManager, "Should not set parent manager!");
+    NS_ASSERTION(mChrome || !aParentManager, "Should not set parent manager!");
+    NS_ASSERTION(!mIsBroadcaster || !mCallback,
+                 "Broadcasters cannot have callbacks!");
     // This is a bit hackish. When parent manager is global, we want
     // to attach the window message manager to it immediately.
     // Is it just the frame message manager which waits until the
     // content process is running.
-    if (mParentManager && (mCallbackData || IsWindowLevel())) {
+    if (mParentManager && (mCallback || IsWindowLevel())) {
       mParentManager->AddChildManager(this);
     }
+    if (mOwnsCallback) {
+      mOwnedCallback = aCallback;
+    }
   }
 
   ~nsFrameMessageManager()
   {
     for (int32_t i = mChildManagers.Count(); i > 0; --i) {
       static_cast<nsFrameMessageManager*>(mChildManagers[i - 1])->
         Disconnect(false);
     }
@@ -114,45 +147,48 @@ public:
   NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsFrameMessageManager,
                                            nsIContentFrameMessageManager)
   NS_DECL_NSIMESSAGELISTENERMANAGER
   NS_DECL_NSIMESSAGESENDER
   NS_DECL_NSIMESSAGEBROADCASTER
   NS_DECL_NSISYNCMESSAGESENDER
   NS_DECL_NSICONTENTFRAMEMESSAGEMANAGER
   NS_DECL_NSIFRAMESCRIPTLOADER
+  NS_DECL_NSIPERMISSIONCHECKER
 
   static nsFrameMessageManager*
   NewProcessMessageManager(mozilla::dom::ContentParent* aProcess);
 
   nsresult ReceiveMessage(nsISupports* aTarget, const nsAString& aMessage,
                           bool aSync, const StructuredCloneData* aCloneData,
                           JSObject* aObjectsArray,
                           InfallibleTArray<nsString>* aJSONRetVal,
                           JSContext* aContext = nullptr);
 
   void AddChildManager(nsFrameMessageManager* aManager,
                        bool aLoadScripts = true);
   void RemoveChildManager(nsFrameMessageManager* aManager)
   {
     mChildManagers.RemoveObject(aManager);
   }
+  void Disconnect(bool aRemoveFromParent = true);
 
-  void Disconnect(bool aRemoveFromParent = true);
-  void SetCallbackData(void* aData, bool aLoadScripts = true);
-  void* GetCallbackData() { return mCallbackData; }
-  enum ShouldBroadcast { BROADCAST, DONT_BROADCAST };
+  void SetCallback(mozilla::dom::ipc::MessageManagerCallback* aCallback,
+                   bool aLoadScripts = true);
+  mozilla::dom::ipc::MessageManagerCallback* GetCallback()
+  {
+    return mCallback;
+  }
+
   nsresult DispatchAsyncMessage(const nsAString& aMessageName,
                                 const jsval& aObject,
                                 JSContext* aCx,
-                                uint8_t aArgc,
-                                ShouldBroadcast aBroadcast);
+                                uint8_t aArgc);
   nsresult DispatchAsyncMessageInternal(const nsAString& aMessage,
-                                        const StructuredCloneData& aData,
-                                        ShouldBroadcast aBroadcast);
+                                        const StructuredCloneData& aData);
   JSContext* GetJSContext() { return mContext; }
   void SetJSContext(JSContext* aCx) { mContext = aCx; }
   void RemoveFromParent();
   nsFrameMessageManager* GetParentManager() { return mParentManager; }
   void SetParentManager(nsFrameMessageManager* aParent)
   {
     NS_ASSERTION(!mParentManager, "We have parent manager already!");
     NS_ASSERTION(mChrome, "Should not set parent manager!");
@@ -169,26 +205,25 @@ public:
   {
     return sChildProcessManager;
   }
 protected:
   friend class MMListenerRemover;
   nsTArray<nsMessageListenerInfo> mListeners;
   nsCOMArray<nsIContentFrameMessageManager> mChildManagers;
   bool mChrome;     // true if we're in the chrome process
-  bool mGlobal;     // true if 
+  bool mGlobal;     // true if we're the global frame message manager
   bool mIsProcessManager; // true if the message manager belongs to the process realm
   bool mIsBroadcaster; // true if the message manager is a broadcaster
+  bool mOwnsCallback;
   bool mHandlingMessage;
   bool mDisconnected;
+  mozilla::dom::ipc::MessageManagerCallback* mCallback;
+  nsAutoPtr<mozilla::dom::ipc::MessageManagerCallback> mOwnedCallback;
   nsFrameMessageManager* mParentManager;
-  nsSyncMessageCallback mSyncCallback;
-  nsAsyncMessageCallback mAsyncCallback;
-  nsLoadScriptCallback mLoadScriptCallback;
-  void* mCallbackData;
   JSContext* mContext;
   nsTArray<nsString> mPendingScripts;
 public:
   static nsFrameMessageManager* sParentProcessManager;
   static nsFrameMessageManager* sChildProcessManager;
   static nsFrameMessageManager* sSameProcessParentManager;
   static nsTArray<nsCOMPtr<nsIRunnable> >* sPendingSameProcessAsyncMessages;
 };
--- a/content/base/src/nsInProcessTabChildGlobal.cpp
+++ b/content/base/src/nsInProcessTabChildGlobal.cpp
@@ -20,34 +20,31 @@
 #include "xpcpublic.h"
 #include "nsIMozBrowserFrame.h"
 #include "nsDOMClassInfoID.h"
 #include "mozilla/dom/StructuredCloneUtils.h"
 
 using mozilla::dom::StructuredCloneData;
 using mozilla::dom::StructuredCloneClosure;
 
-bool SendSyncMessageToParent(void* aCallbackData,
-                             const nsAString& aMessage,
-                             const StructuredCloneData& aData,
-                             InfallibleTArray<nsString>* aJSONRetVal)
+bool
+nsInProcessTabChildGlobal::DoSendSyncMessage(const nsAString& aMessage,
+                                             const StructuredCloneData& aData,
+                                             InfallibleTArray<nsString>* aJSONRetVal)
 {
-  nsInProcessTabChildGlobal* tabChild =
-    static_cast<nsInProcessTabChildGlobal*>(aCallbackData);
-  nsCOMPtr<nsIContent> owner = tabChild->mOwner;
   nsTArray<nsCOMPtr<nsIRunnable> > asyncMessages;
-  asyncMessages.SwapElements(tabChild->mASyncMessages);
+  asyncMessages.SwapElements(mASyncMessages);
   uint32_t len = asyncMessages.Length();
   for (uint32_t i = 0; i < len; ++i) {
     nsCOMPtr<nsIRunnable> async = asyncMessages[i];
     async->Run();
   }
-  if (tabChild->mChromeMessageManager) {
-    nsRefPtr<nsFrameMessageManager> mm = tabChild->mChromeMessageManager;
-    mm->ReceiveMessage(owner, aMessage, true, &aData, nullptr, aJSONRetVal);
+  if (mChromeMessageManager) {
+    nsRefPtr<nsFrameMessageManager> mm = mChromeMessageManager;
+    mm->ReceiveMessage(mOwner, aMessage, true, &aData, nullptr, aJSONRetVal);
   }
   return true;
 }
 
 class nsAsyncMessageToParent : public nsRunnable
 {
 public:
   nsAsyncMessageToParent(nsInProcessTabChildGlobal* aTabChild,
@@ -77,25 +74,23 @@ public:
     return NS_OK;
   }
   nsRefPtr<nsInProcessTabChildGlobal> mTabChild;
   nsString mMessage;
   JSAutoStructuredCloneBuffer mData;
   StructuredCloneClosure mClosure;
 };
 
-bool SendAsyncMessageToParent(void* aCallbackData,
-                              const nsAString& aMessage,
-                              const StructuredCloneData& aData)
+bool
+nsInProcessTabChildGlobal::DoSendAsyncMessage(const nsAString& aMessage,
+                                              const StructuredCloneData& aData)
 {
-  nsInProcessTabChildGlobal* tabChild =
-    static_cast<nsInProcessTabChildGlobal*>(aCallbackData);
   nsCOMPtr<nsIRunnable> ev =
-    new nsAsyncMessageToParent(tabChild, aMessage, aData);
-  tabChild->mASyncMessages.AppendElement(ev);
+    new nsAsyncMessageToParent(this, aMessage, aData);
+  mASyncMessages.AppendElement(ev);
   NS_DispatchToCurrentThread(ev);
   return true;
 }
 
 nsInProcessTabChildGlobal::nsInProcessTabChildGlobal(nsIDocShell* aShell,
                                                      nsIContent* aOwner,
                                                      nsFrameMessageManager* aChrome)
 : mDocShell(aShell), mInitialized(false), mLoadingScript(false),
@@ -130,23 +125,20 @@ nsresult
 nsInProcessTabChildGlobal::Init()
 {
 #ifdef DEBUG
   nsresult rv =
 #endif
   InitTabChildGlobal();
   NS_WARN_IF_FALSE(NS_SUCCEEDED(rv),
                    "Couldn't initialize nsInProcessTabChildGlobal");
-  mMessageManager = new nsFrameMessageManager(false, /* aChrome */
-                                              SendSyncMessageToParent,
-                                              SendAsyncMessageToParent,
+  mMessageManager = new nsFrameMessageManager(this,
                                               nullptr,
-                                              this,
-                                              nullptr,
-                                              mCx);
+                                              mCx,
+                                              mozilla::dom::ipc::MM_CHILD);
 
   // Set the location information for the new global, so that tools like
   // about:memory may use that information.
   JSObject *global;
   nsIURI* docURI = mOwner->OwnerDoc()->GetDocumentURI();
   if (mGlobal && NS_SUCCEEDED(mGlobal->GetJSObject(&global)) && docURI) {
     xpc::SetLocationForGlobal(global, docURI);
   }
--- a/content/base/src/nsInProcessTabChildGlobal.h
+++ b/content/base/src/nsInProcessTabChildGlobal.h
@@ -19,17 +19,18 @@
 #include "nsIDOMElement.h"
 #include "nsCOMArray.h"
 #include "nsThreadUtils.h"
 
 class nsInProcessTabChildGlobal : public nsDOMEventTargetHelper,
                                   public nsFrameScriptExecutor,
                                   public nsIInProcessContentFrameMessageManager,
                                   public nsIScriptObjectPrincipal,
-                                  public nsIScriptContextPrincipal
+                                  public nsIScriptContextPrincipal,
+                                  public mozilla::dom::ipc::MessageManagerCallback
 {
 public:
   nsInProcessTabChildGlobal(nsIDocShell* aShell, nsIContent* aOwner,
                             nsFrameMessageManager* aChrome);
   virtual ~nsInProcessTabChildGlobal();
   NS_DECL_ISUPPORTS_INHERITED
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsInProcessTabChildGlobal,
                                            nsDOMEventTargetHelper)
@@ -54,16 +55,25 @@ public:
   NS_IMETHOD PrivateNoteIntentionalCrash();
   NS_IMETHOD Btoa(const nsAString& aBinaryData,
                   nsAString& aAsciiBase64String);
   NS_IMETHOD Atob(const nsAString& aAsciiString,
                   nsAString& aBinaryData);
 
   NS_DECL_NSIINPROCESSCONTENTFRAMEMESSAGEMANAGER
 
+  /**
+   * MessageManagerCallback methods that we override.
+   */
+  virtual bool DoSendSyncMessage(const nsAString& aMessage,
+                                 const mozilla::dom::StructuredCloneData& aData,
+                                 InfallibleTArray<nsString>* aJSONRetVal);
+  virtual bool DoSendAsyncMessage(const nsAString& aMessage,
+                                  const mozilla::dom::StructuredCloneData& aData);
+
   virtual nsresult PreHandleEvent(nsEventChainPreVisitor& aVisitor);
   NS_IMETHOD AddEventListener(const nsAString& aType,
                               nsIDOMEventListener* aListener,
                               bool aUseCapture)
   {
     // By default add listeners only for trusted events!
     return nsDOMEventTargetHelper::AddEventListener(aType, aListener,
                                                     aUseCapture, false, 2);
--- a/content/base/src/nsNodeInfo.cpp
+++ b/content/base/src/nsNodeInfo.cpp
@@ -129,17 +129,17 @@ nsNodeInfo::nsNodeInfo(nsIAtom *aName, n
       SetDOMStringToNull(mLocalName);
       break;
     case nsIDOMNode::PROCESSING_INSTRUCTION_NODE:
     case nsIDOMNode::DOCUMENT_TYPE_NODE:
       mInner.mExtraName->ToString(mNodeName);
       SetDOMStringToNull(mLocalName);
       break;
     default:
-      NS_ABORT_IF_FALSE(aNodeType == PR_UINT16_MAX,
+      NS_ABORT_IF_FALSE(aNodeType == UINT16_MAX,
                         "Unknown node type");
   }
 }
 
 
 // nsISupports
 
 NS_IMPL_CYCLE_COLLECTION_CLASS(nsNodeInfo)
--- a/content/base/src/nsNodeInfo.h
+++ b/content/base/src/nsNodeInfo.h
@@ -76,25 +76,25 @@ CheckValidNodeInfo(uint16_t aNodeType, n
                     aNodeType == nsIDOMNode::ATTRIBUTE_NODE ||
                     aNodeType == nsIDOMNode::TEXT_NODE ||
                     aNodeType == nsIDOMNode::CDATA_SECTION_NODE ||
                     aNodeType == nsIDOMNode::PROCESSING_INSTRUCTION_NODE ||
                     aNodeType == nsIDOMNode::COMMENT_NODE ||
                     aNodeType == nsIDOMNode::DOCUMENT_NODE ||
                     aNodeType == nsIDOMNode::DOCUMENT_TYPE_NODE ||
                     aNodeType == nsIDOMNode::DOCUMENT_FRAGMENT_NODE ||
-                    aNodeType == PR_UINT16_MAX,
+                    aNodeType == UINT16_MAX,
                     "Invalid nodeType");
   NS_ABORT_IF_FALSE((aNodeType == nsIDOMNode::PROCESSING_INSTRUCTION_NODE ||
                      aNodeType == nsIDOMNode::DOCUMENT_TYPE_NODE) ==
                     !!aExtraName,
                     "Supply aExtraName for and only for PIs and doctypes");
   NS_ABORT_IF_FALSE(aNodeType == nsIDOMNode::ELEMENT_NODE ||
                     aNodeType == nsIDOMNode::ATTRIBUTE_NODE ||
-                    aNodeType == PR_UINT16_MAX ||
+                    aNodeType == UINT16_MAX ||
                     aNamespaceID == kNameSpaceID_None,
                     "Only attributes and elements can be in a namespace");
   NS_ABORT_IF_FALSE(aName && aName != nsGkAtoms::_empty, "Invalid localName");
   NS_ABORT_IF_FALSE(((aNodeType == nsIDOMNode::TEXT_NODE) ==
                      (aName == nsGkAtoms::textTagName)) &&
                     ((aNodeType == nsIDOMNode::CDATA_SECTION_NODE) ==
                      (aName == nsGkAtoms::cdataTagName)) &&
                     ((aNodeType == nsIDOMNode::COMMENT_NODE) ==
--- a/content/base/src/nsObjectLoadingContent.cpp
+++ b/content/base/src/nsObjectLoadingContent.cpp
@@ -946,17 +946,17 @@ nsObjectLoadingContent::HasNewFrame(nsIO
     DisconnectFrame();
 
     // Set up relationship between instance owner and frame.
     nsObjectFrame *objFrame = static_cast<nsObjectFrame*>(aFrame);
     mInstanceOwner->SetFrame(objFrame);
 
     // Set up new frame to draw.
     objFrame->FixupWindow(objFrame->GetContentRectRelativeToSelf().Size());
-    objFrame->Invalidate(objFrame->GetContentRectRelativeToSelf());
+    objFrame->InvalidateFrame();
   }
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsObjectLoadingContent::DisconnectFrame()
 {
   if (mInstanceOwner) {
--- a/content/base/src/nsSyncLoadService.cpp
+++ b/content/base/src/nsSyncLoadService.cpp
@@ -337,17 +337,17 @@ nsSyncLoadService::PushSyncStreamToListe
     nsresult rv;
     nsCOMPtr<nsIInputStream> bufferedStream;
     if (!NS_InputStreamIsBuffered(aIn)) {
         int32_t chunkSize;
         rv = aChannel->GetContentLength(&chunkSize);
         if (NS_FAILED(rv)) {
             chunkSize = 4096;
         }
-        chunkSize = NS_MIN(int32_t(PR_UINT16_MAX), chunkSize);
+        chunkSize = NS_MIN(int32_t(UINT16_MAX), chunkSize);
 
         rv = NS_NewBufferedInputStream(getter_AddRefs(bufferedStream), aIn,
                                        chunkSize);
         NS_ENSURE_SUCCESS(rv, rv);
 
         aIn = bufferedStream;
     }
 
@@ -361,21 +361,21 @@ nsSyncLoadService::PushSyncStreamToListe
             if (NS_FAILED(rv) || !readCount) {
                 if (rv == NS_BASE_STREAM_CLOSED) {
                     // End of file, but not an error
                     rv = NS_OK;
                 }
                 break;
             }
 
-            if (readCount > PR_UINT32_MAX)
-                readCount = PR_UINT32_MAX;
+            if (readCount > UINT32_MAX)
+                readCount = UINT32_MAX;
 
             rv = aListener->OnDataAvailable(aChannel, nullptr, aIn,
-                                            (uint32_t)NS_MIN(sourceOffset, (uint64_t)PR_UINT32_MAX),
+                                            (uint32_t)NS_MIN(sourceOffset, (uint64_t)UINT32_MAX),
                                             (uint32_t)readCount);
             if (NS_FAILED(rv)) {
                 break;
             }
             sourceOffset += readCount;
         }
     }
     if (NS_FAILED(rv)) {
--- a/content/base/src/nsXMLHttpRequest.cpp
+++ b/content/base/src/nsXMLHttpRequest.cpp
@@ -2439,17 +2439,17 @@ GetRequestBody(nsIDOMDocument* aDoc, nsI
   // Serialize to a stream so that the encoding used will
   // match the document's.
   nsresult rv;
   nsCOMPtr<nsIDOMSerializer> serializer =
     do_CreateInstance(NS_XMLSERIALIZER_CONTRACTID, &rv);
   NS_ENSURE_SUCCESS(rv, rv);
 
   nsCOMPtr<nsIStorageStream> storStream;
-  rv = NS_NewStorageStream(4096, PR_UINT32_MAX, getter_AddRefs(storStream));
+  rv = NS_NewStorageStream(4096, UINT32_MAX, getter_AddRefs(storStream));
   NS_ENSURE_SUCCESS(rv, rv);
 
   nsCOMPtr<nsIOutputStream> output;
   rv = storStream->GetOutputStream(0, getter_AddRefs(output));
   NS_ENSURE_SUCCESS(rv, rv);
 
   // Make sure to use the encoding we'll send
   rv = serializer->SerializeToStream(aDoc, output, aCharset);
--- a/content/base/test/Makefile.in
+++ b/content/base/test/Makefile.in
@@ -566,16 +566,27 @@ MOCHITEST_FILES_B = \
 		test_XHR_parameters.html \
 		test_ipc_messagemanager_blob.html \
 		test_mixed_content_blocker.html \
 		file_mixed_content_main.html \
 		file_mixed_content_server.sjs \
 		test_bug789856.html \
 		$(NULL)
 
+# OOP tests don't work on Windows (bug 763081) or native-fennec
+# (see Bug 774939)
+ifneq ($(OS_ARCH),WINNT)
+ifndef MOZ_JAVA_COMPOSITOR
+MOCHITEST_FILES_B += \
+		test_messagemanager_assertpermission.html \
+		test_child_process_shutdown_message.html \
+		$(NULL)
+endif
+endif
+
 MOCHITEST_CHROME_FILES =	\
 		test_bug357450.js \
 		$(NULL)
 
 MOCHITEST_FILES_PARTS = $(foreach s,A B,MOCHITEST_FILES_$(s))
 
 # This test fails on the Mac for some reason
 ifneq (,$(filter gtk2 windows,$(MOZ_WIDGET_TOOLKIT)))
new file mode 100644
--- /dev/null
+++ b/content/base/test/test_child_process_shutdown_message.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Test that processes that are shutdown send a 'process-shutdown'
+         message to their process message manager.</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>        
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body onload="runTests();">
+<p id="display">
+</p>
+<div id="content" style="display: none">
+  
+</div>
+<pre id="test">
+<script class="testbody" type="application/javascript;version=1.8">
+
+const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = SpecialPowers.wrap(Components);
+
+const APP_URL = "http://example.org";
+const APP_MANIFEST = "http://example.org/manifest.webapp";
+const CHILD_PROCESS_SHUTDOWN_MESSAGE = "child-process-shutdown";
+
+let ppmm = Cc["@mozilla.org/parentprocessmessagemanager;1"]
+             .getService(Ci.nsIMessageBroadcaster);
+
+/**
+ * Load the example.org app in an <iframe mozbrowser mozapp>
+ */
+function loadApp(callback) {
+  let iframe = document.createElement("iframe");
+  iframe.setAttribute("mozapp", APP_MANIFEST);
+  iframe.mozbrowser = true;
+  iframe.src = APP_URL;
+  document.getElementById("content").appendChild(iframe);
+
+  iframe.addEventListener("mozbrowserloadend", function onloadend() {
+    iframe.removeEventListener("mozbrowserloadend", onloadend);
+    callback(iframe);
+  });
+}
+
+/**
+ * Prepare the child process for an intentional crash. This is to keep
+ * the leak automation tools happy.
+ *
+ * This also allows us to acquire the process message manaager that
+ * corresponds to the process by sending a message to a frame script
+ * in the content process and having it reply to us via the child
+ * process message manager.
+ */
+function prepareProcess(frameMM, callback) {
+  let frameScript = 'data:,\
+    privateNoteIntentionalCrash();\
+    var cpmm = Components.classes["@mozilla.org/childprocessmessagemanager;1"]\
+                         .getService(Components.interfaces.nsISyncMessageSender);\
+    addMessageListener("TestChild:Ohai", function receiveMessage(msg) {\
+      cpmm.sendAsyncMessage("TestChild:Ohai");\
+    });';
+  frameMM.loadFrameScript(frameScript, false);
+  frameMM.sendAsyncMessage("TestChild:Ohai");
+  ppmm.addMessageListener("TestChild:Ohai", function receiveMessage(msg) {
+    ppmm.removeMessageListener("TestChild:Ohai", receiveMessage);
+    msg = SpecialPowers.wrap(msg);
+    callback(msg.target);
+  });
+}
+
+/**
+ * Expects an OOP frame's process to shut down and report three
+ * events/messages: an error event on the browser element, and a
+ * 'child-process-shutdown' message on both the frame and process
+ * message managers.
+ */
+function expectFrameProcessShutdown(iframe, frameMM, processMM, callback) {
+  let msgCount = 0;
+  function countMessage() {
+    msgCount += 1;
+    if (msgCount == 3) {
+      ok(true, "Observed all three expected events.");
+      callback();
+    }
+  };
+
+  iframe.addEventListener("mozbrowsererror", function onerror(event) {
+    iframe.removeEventListener("mozbrowsererror", onerror);
+    is(event.detail.type, "fatal", "Observed expected event.");
+    countMessage();
+  });
+
+  processMM.addMessageListener(CHILD_PROCESS_SHUTDOWN_MESSAGE, function receiveMessage() {
+    processMM.removeMessageListener(CHILD_PROCESS_SHUTDOWN_MESSAGE, receiveMessage);
+    ok(true, "Received 'child-process-shutdown' message from process message manager.");
+    countMessage();
+  });
+
+  frameMM.addMessageListener(CHILD_PROCESS_SHUTDOWN_MESSAGE, function receiveMessage() {
+    frameMM.removeMessageListener(CHILD_PROCESS_SHUTDOWN_MESSAGE, receiveMessage);
+    ok(true, "Received 'child-process-shutdown' message from frame message manager.");
+    countMessage();
+  });
+}
+
+function runTests(callback) {
+  SpecialPowers.setBoolPref("dom.mozBrowserFramesEnabled", true);
+  SpecialPowers.setBoolPref("dom.ipc.browser_frames.oop_by_default", true);
+  SpecialPowers.addPermission("browser", true, window.document);
+
+  function tearDown() {
+    SpecialPowers.clearUserPref("dom.mozBrowserFramesEnabled");
+    SpecialPowers.clearUserPref("dom.ipc.browser_frames.oop_by_default");
+    SimpleTest.finish();
+  }
+
+  loadApp(function (iframe) {
+    // We want to make sure we get notified on both the frame and
+    // process message managers.
+    let frameMM = SpecialPowers.getBrowserFrameMessageManager(iframe);
+    prepareProcess(frameMM, function (processMM) {
+      // Let's kill the content process by asking for a permission
+      // that it doesn't have.
+      ok(!processMM.assertPermission("frobnaz"),
+         "Content child should not have this permission");
+      expectFrameProcessShutdown(iframe, frameMM, processMM, function () {
+        iframe.parentNode.removeChild(iframe);
+        tearDown();
+      });
+    });
+  });
+}
+
+</script>
+</pre>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/content/base/test/test_messagemanager_assertpermission.html
@@ -0,0 +1,196 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Test for the nsIPermissionChecker part of Message Managers</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>        
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body onload="runTests();">
+<p id="display">
+</p>
+<div id="content" style="display: none">
+  
+</div>
+<pre id="test">
+<script class="testbody" type="application/javascript;version=1.8">
+
+const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = SpecialPowers.wrap(Components);
+
+const APP_URL = "http://example.org";
+const APP_MANIFEST = "http://example.org/manifest.webapp";
+const CHILD_PROCESS_SHUTDOWN_MESSAGE = "child-process-shutdown";
+
+let ppmm = Cc["@mozilla.org/parentprocessmessagemanager;1"]
+             .getService(Ci.nsIMessageBroadcaster);
+let cpmm = Cc["@mozilla.org/childprocessmessagemanager;1"]
+             .getService(Ci.nsISyncMessageSender);
+let gAppsService = Cc["@mozilla.org/AppsService;1"]
+                     .getService(Ci.nsIAppsService);
+
+function setUp() {
+  SpecialPowers.setBoolPref("dom.mozBrowserFramesEnabled", true);
+  SpecialPowers.setBoolPref("dom.ipc.browser_frames.oop_by_default", true);
+  SpecialPowers.addPermission("browser", true, window.document);
+
+  let appId = gAppsService.getAppLocalIdByManifestURL(APP_MANIFEST);
+  SpecialPowers.addPermission("foobar", true, { url: APP_URL,
+                                                appId: appId,
+                                                isInBrowserElement: false });
+  runNextTest();
+}
+
+/**
+ * Load the example.org app in an <iframe mozbrowser mozapp>
+ */
+function loadApp(callback) {
+  let iframe = document.createElement("iframe");
+  iframe.setAttribute("mozapp", APP_MANIFEST);
+  iframe.mozbrowser = true;
+  iframe.src = APP_URL;
+  document.getElementById("content").appendChild(iframe);
+
+  iframe.addEventListener("mozbrowserloadend", function onloadend() {
+    iframe.removeEventListener("mozbrowserloadend", onloadend);
+    callback(iframe);
+  });
+}
+
+/**
+ * Prepare the child process for an intentional crash. This is to keep
+ * the leak automation tools happy.
+ *
+ * This also allows us to acquire the process message manaager that
+ * corresponds to the process by sending a message to a frame script
+ * in the content process and having it reply to us via the child
+ * process message manager.
+ */
+function prepareProcess(frameMM, callback) {
+  let frameScript = 'data:,\
+    privateNoteIntentionalCrash();\
+    var cpmm = Components.classes["@mozilla.org/childprocessmessagemanager;1"]\
+                         .getService(Components.interfaces.nsISyncMessageSender);\
+    addMessageListener("TestChild:Ohai", function receiveMessage(msg) {\
+      cpmm.sendAsyncMessage("TestChild:Ohai");\
+    });';
+  frameMM.loadFrameScript(frameScript, false);
+  frameMM.sendAsyncMessage("TestChild:Ohai");
+  ppmm.addMessageListener("TestChild:Ohai", function receiveMessage(msg) {
+    ppmm.removeMessageListener("TestChild:Ohai", receiveMessage);
+    msg = SpecialPowers.wrap(msg);
+    callback(msg.target);
+  });
+}
+
+/**
+ * Expects an OOP frame's process to shut down and report three
+ * events/messages: an error event on the browser element, and a
+ * 'child-process-shutdown' message on both the frame and process
+ * message managers.
+ */
+function expectFrameProcessShutdown(iframe, frameMM, processMM, callback) {
+  let msgCount = 0;
+  function countMessage() {
+    msgCount += 1;
+    if (msgCount == 3) {
+      ok(true, "Observed all three expected events.");
+      callback();
+    }
+  };
+
+  iframe.addEventListener("mozbrowsererror", function onerror(event) {
+    iframe.removeEventListener("mozbrowsererror", onerror);
+    is(event.detail.type, "fatal", "Observed expected event.");
+    countMessage();
+  });
+
+  processMM.addMessageListener(CHILD_PROCESS_SHUTDOWN_MESSAGE, function receiveMessage() {
+    processMM.removeMessageListener(CHILD_PROCESS_SHUTDOWN_MESSAGE, receiveMessage);
+    ok(true, "Received 'child-process-shutdown' message from process message manager.");
+    countMessage();
+  });
+
+  frameMM.addMessageListener(CHILD_PROCESS_SHUTDOWN_MESSAGE, function receiveMessage() {
+    frameMM.removeMessageListener(CHILD_PROCESS_SHUTDOWN_MESSAGE, receiveMessage);
+    ok(true, "Received 'child-process-shutdown' message from frame message manager.");
+    countMessage();
+  });
+}
+
+function testSameProcess() {
+  // Assert permissions on the in-process child process message manager.
+  // It always has all permissions, including ones that were never
+  // assigned to anybody.
+
+  cpmm.sendAsyncMessage("TestPermission:InProcess");
+  ppmm.addMessageListener("TestPermission:InProcess", function receiveMessage(msg) {
+    ppmm.removeMessageListener("TestPermission:InProcess", receiveMessage);
+    msg = SpecialPowers.wrap(msg);
+
+    ok(msg.target.assertPermission("frobnaz"), "in-process cpmm always has all capabilities");
+    runNextTest();
+  });
+}
+
+function testFrameMessageManager() {
+  // Assert permissions on the frame message manager.
+
+  loadApp(function (iframe) {
+    let frameMM = SpecialPowers.getBrowserFrameMessageManager(iframe);
+    prepareProcess(frameMM, function (processMM) {
+      ok(frameMM.assertPermission("foobar"),
+         "Frame mm has assigned permission.");
+      ok(!frameMM.assertPermission("frobnaz"),
+         "Frame mm doesn't have non-existing permission.");
+      expectFrameProcessShutdown(iframe, frameMM, processMM, function () {
+        iframe.parentNode.removeChild(iframe);
+        runNextTest();
+      });
+    });
+  });
+}
+
+function testChildProcessMessageManager() {
+  // Assert permissions on the child process message manager.
+
+  loadApp(function (iframe) {
+    let frameMM = SpecialPowers.getBrowserFrameMessageManager(iframe);
+    prepareProcess(frameMM, function (processMM) {
+      ok(processMM.assertPermission("foobar"),
+         "Process mm has assigned permission.");
+      ok(!processMM.assertPermission("frobnaz"),
+         "Process mm doesn't have non-existing permission.");
+      expectFrameProcessShutdown(iframe, frameMM, processMM, function () {
+        iframe.parentNode.removeChild(iframe);
+        runNextTest();
+      });
+    });
+  });
+}
+
+function tearDown() {
+  SpecialPowers.clearUserPref("dom.mozBrowserFramesEnabled");
+  SpecialPowers.clearUserPref("dom.ipc.browser_frames.oop_by_default");
+  SimpleTest.finish();
+}
+
+let _tests = [
+  setUp,
+  testSameProcess,
+  testFrameMessageManager,
+  testChildProcessMessageManager,
+  tearDown
+]
+function runNextTest() {
+  SimpleTest.executeSoon(_tests.shift());
+}
+
+function runTests() {
+  SimpleTest.waitForExplicitFinish();
+  runNextTest();
+}
+
+</script>
+</pre>
+</body>
+</html>
--- a/content/canvas/src/WebGLContextGL.cpp
+++ b/content/canvas/src/WebGLContextGL.cpp
@@ -298,16 +298,25 @@ WebGLContext::BlendFuncSeparate(WebGLenu
     gl->fBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
 }
 
 GLenum WebGLContext::CheckedBufferData(GLenum target,
                                        GLsizeiptr size,
                                        const GLvoid *data,
                                        GLenum usage)
 {
+#ifdef XP_MACOSX
+    // bug 790879
+    if (gl->WorkAroundDriverBugs() &&
+        int64_t(size) > INT32_MAX) // the cast avoids a potential always-true warning on 32bit
+    {
+        GenerateWarning("Rejecting valid bufferData call with size %lu to avoid a Mac bug", size);
+        return LOCAL_GL_INVALID_VALUE;
+    }
+#endif
     WebGLBuffer *boundBuffer = NULL;
     if (target == LOCAL_GL_ARRAY_BUFFER) {
         boundBuffer = mBoundArrayBuffer;
     } else if (target == LOCAL_GL_ELEMENT_ARRAY_BUFFER) {
         boundBuffer = mBoundElementArrayBuffer;
     }
     NS_ABORT_IF_FALSE(boundBuffer != nullptr, "no buffer bound for this target");
     
@@ -658,16 +667,39 @@ WebGLContext::CopyTexSubImage2D_base(Web
     const WebGLRectangleObject *framebufferRect = FramebufferRectangleObject();
     WebGLsizei framebufferWidth = framebufferRect ? framebufferRect->Width() : 0;
     WebGLsizei framebufferHeight = framebufferRect ? framebufferRect->Height() : 0;
 
     const char *info = sub ? "copyTexSubImage2D" : "copyTexImage2D";
 
     MakeContextCurrent();
 
+    WebGLTexture *tex = activeBoundTextureForTarget(target);
+
+    if (!tex)
+        return ErrorInvalidOperation("%s: no texture is bound to this target");
+
+#ifdef MOZ_X11
+    // bug 785734
+    if (gl->WorkAroundDriverBugs() &&
+        mIsMesa &&
+        level > 0 &&
+        !sub)
+    {
+        size_t face = WebGLTexture::FaceForTarget(target);
+        if (!tex->HasImageInfoAt(0, face) ||
+            tex->ImageInfoAt(0, face).Width() <= width)
+        {
+            return  ErrorInvalidOperation("%s: rejecting valid call to avoid Mesa driver crash. "
+                                          "See Mozilla bug 785734",
+                                          info);
+        }
+    }
+#endif
+
     if (CanvasUtils::CheckSaneSubrectSize(x, y, width, height, framebufferWidth, framebufferHeight)) {
         if (sub)
             gl->fCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
         else
             gl->fCopyTexImage2D(target, level, internalformat, x, y, width, height, 0);
     } else {
 
         // the rect doesn't fit in the framebuffer
@@ -4652,17 +4684,16 @@ WebGLContext::TexImage2D_base(WebGLenum 
         if (!(is_pot_assuming_nonnegative(width) &&
               is_pot_assuming_nonnegative(height)))
             return ErrorInvalidValue("texImage2D: with level > 0, width and height must be powers of two");
     }
 
     if (border != 0)
         return ErrorInvalidValue("texImage2D: border must be 0");
 
-
     if (format == LOCAL_GL_DEPTH_COMPONENT || format == LOCAL_GL_DEPTH_STENCIL) {
         if (IsExtensionEnabled(WEBGL_depth_texture)) {
             if (target != LOCAL_GL_TEXTURE_2D || data != NULL || level != 0)
                 return ErrorInvalidOperation("texImage2D: "
                                              "with format of DEPTH_COMPONENT or DEPTH_STENCIL "
                                              "target must be TEXTURE_2D, "
                                              "data must be NULL, "
                                              "level must be zero");
@@ -4703,16 +4734,32 @@ WebGLContext::TexImage2D_base(WebGLenum 
         return ErrorInvalidOperation("texImage2D: no texture is bound to this target");
 
     MakeContextCurrent();
 
     // Handle ES2 and GL differences in floating point internal formats.  Note that
     // format == internalformat, as checked above and as required by ES.
     internalformat = InternalFormatForFormatAndType(format, type, gl->IsGLES2());
 
+#ifdef MOZ_X11
+    // bug 785734
+    if (gl->WorkAroundDriverBugs() &&
+        mIsMesa &&
+        level > 0)
+    {
+        size_t face = WebGLTexture::FaceForTarget(target);
+        if (!tex->HasImageInfoAt(0, face) ||
+            tex->ImageInfoAt(0, face).Width() <= width)
+        {
+            return  ErrorInvalidOperation("texImage2D: rejecting valid call to avoid Mesa driver crash. "
+                                          "See Mozilla bug 785734");
+        }
+    }
+#endif
+
     GLenum error = LOCAL_GL_NO_ERROR;
 
     if (byteLength) {
         size_t srcStride = srcStrideOrZero ? srcStrideOrZero : checked_alignedRowSize.value();
 
         size_t dstPlainRowSize = dstTexelSize * width;
         size_t unpackAlignment = mPixelStoreUnpackAlignment;
         size_t dstStride = ((dstPlainRowSize + unpackAlignment-1) / unpackAlignment) * unpackAlignment;
--- a/content/events/src/nsContentEventHandler.cpp
+++ b/content/events/src/nsContentEventHandler.cpp
@@ -176,17 +176,17 @@ static uint32_t CountNewlinesInXPLength(
 {
   NS_ASSERTION(aContent->IsNodeOfType(nsINode::eTEXT),
                "aContent is not a text node!");
   const nsTextFragment* text = aContent->GetText();
   if (!text)
     return 0;
   // For automated tests, we should abort on debug build.
   NS_ABORT_IF_FALSE(
-    (aXPLength == PR_UINT32_MAX || aXPLength <= text->GetLength()),
+    (aXPLength == UINT32_MAX || aXPLength <= text->GetLength()),
     "aXPLength is out-of-bounds");
   const uint32_t length = NS_MIN(aXPLength, text->GetLength());
   uint32_t newlines = 0;
   for (uint32_t i = 0; i < length; ++i) {
     if (text->CharAt(i) == '\n') {
       ++newlines;
     }
   }
@@ -199,17 +199,17 @@ static uint32_t CountNewlinesInNativeLen
   NS_ASSERTION(aContent->IsNodeOfType(nsINode::eTEXT),
                "aContent is not a text node!");
   const nsTextFragment* text = aContent->GetText();
   if (!text) {
     return 0;
   }
   // For automated tests, we should abort on debug build.
   NS_ABORT_IF_FALSE(
-    (aNativeLength == PR_UINT32_MAX || aNativeLength <= text->GetLength() * 2),
+    (aNativeLength == UINT32_MAX || aNativeLength <= text->GetLength() * 2),
     "aNativeLength is unexpected value");
   const uint32_t xpLength = text->GetLength();
   uint32_t newlines = 0;
   for (uint32_t i = 0, nativeOffset = 0;
        i < xpLength && nativeOffset < aNativeLength;
        ++i, ++nativeOffset) {
     // For automated tests, we should abort on debug build.
     NS_ABORT_IF_FALSE(i < text->GetLength(), "i is out-of-bounds");
@@ -217,17 +217,17 @@ static uint32_t CountNewlinesInNativeLen
       ++newlines;
       ++nativeOffset;
     }
   }
   return newlines;
 }
 #endif
 
-static uint32_t GetNativeTextLength(nsIContent* aContent, uint32_t aMaxLength = PR_UINT32_MAX)
+static uint32_t GetNativeTextLength(nsIContent* aContent, uint32_t aMaxLength = UINT32_MAX)
 {
   if (aContent->IsNodeOfType(nsINode::eTEXT)) {
     uint32_t textLengthDifference =
 #if defined(XP_MACOSX)
       // On Mac, the length of a native newline ("\r") is equal to the length of
       // the XP newline ("\n"), so the native length is the same as the XP length.
       0;
 #elif defined(XP_WIN)
--- a/content/events/src/nsDOMNotifyPaintEvent.cpp
+++ b/content/events/src/nsDOMNotifyPaintEvent.cpp
@@ -35,22 +35,20 @@ NS_INTERFACE_MAP_END_INHERITING(nsDOMEve
 
 NS_IMPL_ADDREF_INHERITED(nsDOMNotifyPaintEvent, nsDOMEvent)
 NS_IMPL_RELEASE_INHERITED(nsDOMNotifyPaintEvent, nsDOMEvent)
 
 nsRegion
 nsDOMNotifyPaintEvent::GetRegion()
 {
   nsRegion r;
-  bool isTrusted = nsContentUtils::IsCallerTrustedForRead();
+  if (!nsContentUtils::IsCallerTrustedForRead()) {
+    return r;
+  }
   for (uint32_t i = 0; i < mInvalidateRequests.Length(); ++i) {
-    if (!isTrusted &&
-        (mInvalidateRequests[i].mFlags & nsIFrame::INVALIDATE_CROSS_DOC))
-      continue;
-
     r.Or(r, mInvalidateRequests[i].mRect);
     r.SimplifyOutward(10);
   }
   return r;
 }
 
 NS_IMETHODIMP
 nsDOMNotifyPaintEvent::GetBoundingClientRect(nsIDOMClientRect** aResult)
@@ -94,27 +92,25 @@ nsDOMNotifyPaintEvent::GetClientRects(ns
 NS_IMETHODIMP
 nsDOMNotifyPaintEvent::GetPaintRequests(nsIDOMPaintRequestList** aResult)
 {
   nsRefPtr<nsPaintRequestList> requests =
     new nsPaintRequestList(static_cast<nsDOMEvent*>(this));
   if (!requests)
     return NS_ERROR_OUT_OF_MEMORY;
 
-  bool isTrusted = nsContentUtils::IsCallerTrustedForRead();
-  for (uint32_t i = 0; i < mInvalidateRequests.Length(); ++i) {
-    if (!isTrusted &&
-        (mInvalidateRequests[i].mFlags & nsIFrame::INVALIDATE_CROSS_DOC))
-      continue;
-
-    nsRefPtr<nsPaintRequest> r = new nsPaintRequest();
-    if (!r)
-      return NS_ERROR_OUT_OF_MEMORY;
-    r->SetRequest(mInvalidateRequests[i]);
-    requests->Append(r);
+  if (nsContentUtils::IsCallerTrustedForRead()) {
+    for (uint32_t i = 0; i < mInvalidateRequests.Length(); ++i) {
+      nsRefPtr<nsPaintRequest> r = new nsPaintRequest();
+      if (!r)
+        return NS_ERROR_OUT_OF_MEMORY;
+ 
+      r->SetRequest(mInvalidateRequests[i]);
+      requests->Append(r);
+    }
   }
 
   requests.forget(aResult);
   return NS_OK;
 }
 
 NS_IMETHODIMP_(void)
 nsDOMNotifyPaintEvent::Serialize(IPC::Message* aMsg,
--- a/content/events/src/nsEventListenerManager.cpp
+++ b/content/events/src/nsEventListenerManager.cpp
@@ -49,17 +49,17 @@
 #include "nsDOMScriptObjectHolder.h"
 #include "nsDataHashtable.h"
 #include "nsCOMArray.h"
 #include "nsEventListenerService.h"
 #include "nsIContentSecurityPolicy.h"
 #include "nsJSEnvironment.h"
 #include "xpcpublic.h"
 #include "nsSandboxFlags.h"
-#include "TimeChangeObserver.h"
+#include "mozilla/dom/time/TimeChangeObserver.h"
 
 using namespace mozilla::dom;
 using namespace mozilla::hal;
 
 #define EVENT_TYPE_EQUALS( ls, type, userType ) \
   (ls->mEventType == type && \
   (ls->mEventType != NS_USER_DEFINED_EVENT || ls->mTypeAtom == userType))
 
--- a/content/events/src/nsEventStateManager.cpp
+++ b/content/events/src/nsEventStateManager.cpp
@@ -5247,17 +5247,17 @@ nsEventStateManager::DeltaAccumulator::I
   mLastTime = TimeStamp::Now();
 }
 
 void
 nsEventStateManager::DeltaAccumulator::Reset()
 {
   mX = mY = 0.0;
   mPendingScrollAmountX = mPendingScrollAmountY = 0.0;
-  mHandlingDeltaMode = PR_UINT32_MAX;
+  mHandlingDeltaMode = UINT32_MAX;
   mHandlingPixelOnlyDevice = false;
 }
 
 nsIntPoint
 nsEventStateManager::DeltaAccumulator::ComputeScrollAmountForDefaultAction(
                        widget::WheelEvent* aEvent,
                        const nsIntSize& aScrollAmountInDevPixels)
 {
--- a/content/events/src/nsEventStateManager.h
+++ b/content/events/src/nsEventStateManager.h
@@ -553,17 +553,17 @@ protected:
     }
 
     static void Shutdown()
     {
       delete sInstance;
       sInstance = nullptr;
     }
 
-    bool IsInTransaction() { return mHandlingDeltaMode != PR_UINT32_MAX; }
+    bool IsInTransaction() { return mHandlingDeltaMode != UINT32_MAX; }
 
     /**
      * InitLineOrPageDelta() stores pixel delta values of WheelEvents which are
      * caused if it's needed.  And if the accumulated delta becomes a
      * line height, sets lineOrPageDeltaX and lineOrPageDeltaY automatically.
      */
     void InitLineOrPageDelta(nsIFrame* aTargetFrame,
                              nsEventStateManager* aESM,
@@ -580,17 +580,17 @@ protected:
      */
     nsIntPoint ComputeScrollAmountForDefaultAction(
                  mozilla::widget::WheelEvent* aEvent,
                  const nsIntSize& aScrollAmountInDevPixels);
 
   private:
     DeltaAccumulator() :
       mX(0.0), mY(0.0), mPendingScrollAmountX(0.0), mPendingScrollAmountY(0.0),
-      mHandlingDeltaMode(PR_UINT32_MAX), mHandlingPixelOnlyDevice(false)
+      mHandlingDeltaMode(UINT32_MAX), mHandlingPixelOnlyDevice(false)
     {
     }
 
     double mX;
     double mY;
 
     // When default action of a wheel event is scroll but some delta values
     // are ignored because the computed amount values are not integer, the
--- a/content/events/src/nsPaintRequest.cpp
+++ b/content/events/src/nsPaintRequest.cpp
@@ -30,27 +30,17 @@ nsPaintRequest::GetClientRect(nsIDOMClie
   clientRect->SetLayoutRect(mRequest.mRect);
   clientRect.forget(aResult);
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsPaintRequest::GetReason(nsAString& aResult)
 {
-  switch (mRequest.mFlags & nsIFrame::INVALIDATE_REASON_MASK) {
-  case nsIFrame::INVALIDATE_REASON_SCROLL_BLIT:
-    aResult.AssignLiteral("scroll copy");
-    break;
-  case nsIFrame::INVALIDATE_REASON_SCROLL_REPAINT:
-    aResult.AssignLiteral("scroll repaint");
-    break;
-  default:
-    aResult.Truncate();
-    break;
-  }
+  aResult.AssignLiteral("repaint");
   return NS_OK;
 }
 
 DOMCI_DATA(PaintRequestList, nsPaintRequestList)
 
 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_1(nsPaintRequestList, mParent)
 
 NS_INTERFACE_TABLE_HEAD(nsPaintRequestList)
--- a/content/events/test/Makefile.in
+++ b/content/events/test/Makefile.in
@@ -31,16 +31,17 @@ MOCHITEST_FILES = \
 		test_bug379120.html \
 		test_bug391568.xhtml \
 		test_bug402089.html \
 		test_bug405632.html \
 		test_bug409604.html \
 		test_bug412567.html \
 		test_bug422132.html \
 		test_bug426082.html \
+		bug426082.html \
 		test_bug427537.html \
 		test_bug432698.html \
 		test_bug443985.html \
 		test_bug447736.html \
 		test_bug448602.html \
 		test_bug450876.html \
 		test_bug456273.html \
 		test_bug457672.html \
@@ -66,16 +67,17 @@ MOCHITEST_FILES = \
 		test_bug613634.html \
 		test_bug607464.html \
 		test_bug624127.html \
 		test_bug650493.html \
 		test_bug641477.html \
 		test_bug648573.html \
 		test_bug615597.html \
 		test_bug656379-1.html \
+		bug656379-1.html \
 		test_bug656379-2.html \
 		test_bug656954.html \
 		test_bug659071.html \
 		window_bug659071.html \
 		test_bug659350.html \
 		test_bug662678.html \
 		test_bug667919-1.html \
 		test_bug667919-2.html \
new file mode 100644
--- /dev/null
+++ b/content/events/test/bug426082.html
@@ -0,0 +1,161 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=426082
+-->
+<head>
+  <title>Test for Bug 426082</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+  <script type="application/javascript" src="/tests/SimpleTest/WindowSnapshot.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+  <style>
+    canvas {
+      display: none;
+    }
+  </style>
+</head>
+<body onload="runTests()">
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=426082">Mozilla Bug 426082</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+  
+</div>
+<p><input type="button" value="Button" id="button"></p>
+<p><label for="button" id="label">Label</label></p>
+<p id="outside">Something under the label</p>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+
+/** Test for Bug 426082 **/
+
+var normalButtonCanvas, pressedButtonCanvas, normalFocusedButtonCanvas,
+    pressedFocusedButtonCanvas, currentSnapshot, button, label, outside;
+
+function runTests() {
+  button = $("button");
+  label = $("label");
+  outside = $("outside");
+  SimpleTest.executeSoon(executeTests);
+}
+
+function isRectContainedInRectFromRegion(rect, region) {
+  return Array.some(region, function (r) {
+    return rect.left >= r.left &&
+           rect.top >= r.top &&
+           rect.right <= r.right &&
+           rect.bottom <= r.bottom;
+  });
+}
+
+function paintListener(e) {
+  netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+  if (isRectContainedInRectFromRegion(buttonRect(), e.clientRects)) {
+    gNeedsPaint = false;
+    currentSnapshot = takeSnapshot();
+  }
+}
+
+var gNeedsPaint = false;
+function executeTests() {
+  var testYielder = tests();
+  function execNext() {
+    try {
+      if (!gNeedsPaint) {
+        testYielder.next();
+        button.getBoundingClientRect(); // Flush.
+        gNeedsPaint = true;
+      }
+      SimpleTest.executeSoon(execNext);
+    } catch (e) {}
+  }
+  execNext();
+}
+
+function tests() {
+  window.addEventListener("MozAfterPaint", paintListener, false);
+  normalButtonCanvas = takeSnapshot();
+  // Press the button.
+  sendMouseEvent("mousemove", button);
+  sendMouseEvent("mousedown", button);
+  yield;
+  pressedFocusedButtonCanvas = takeSnapshot();
+  compareSnapshots_(normalButtonCanvas, pressedFocusedButtonCanvas, false, "Pressed focused buttons should look different from normal buttons.");
+  // Release.
+  sendMouseEvent("mouseup", button);
+  yield;
+  // make sure the button is focused as this doesn't happen on click on Mac
+  button.focus();
+  normalFocusedButtonCanvas = takeSnapshot();
+  compareSnapshots_(normalFocusedButtonCanvas, pressedFocusedButtonCanvas, false, "Pressed focused buttons should look different from normal focused buttons.");
+  // Unfocus the button.
+  sendMouseEvent("mousedown", outside);
+  sendMouseEvent("mouseup", outside);
+  yield;
+
+  // Press the label.
+  sendMouseEvent("mousemove", label);
+  sendMouseEvent("mousedown", label);
+  yield;
+  compareSnapshots_(normalButtonCanvas, currentSnapshot, false, "Pressing the label should have pressed the button.");
+  pressedButtonCanvas = takeSnapshot();
+  // Move the mouse down from the label.
+  sendMouseEvent("mousemove", outside);
+  yield;
+  compareSnapshots_(normalButtonCanvas, currentSnapshot, true, "Moving the mouse down from the label should have unpressed the button.");
+  // ... and up again.
+  sendMouseEvent("mousemove", label);
+  yield;
+  compareSnapshots_(pressedButtonCanvas, currentSnapshot, true, "Moving the mouse back on top of the label should have pressed the button.");
+  // Release.
+  sendMouseEvent("mouseup", label);
+  yield;
+  compareSnapshots_(normalFocusedButtonCanvas, currentSnapshot, true, "Releasing the mouse over the label should have unpressed (and focused) the button.");
+  // Press the label and remove it.
+  sendMouseEvent("mousemove", label);
+  sendMouseEvent("mousedown", label);
+  yield;
+  label.parentNode.removeChild(label);
+  yield;
+  compareSnapshots_(normalButtonCanvas, currentSnapshot, true, "Removing the label should have unpressed the button.");
+  sendMouseEvent("mouseup", label);
+  window.removeEventListener("MozAfterPaint", paintListener, false);
+  window.opener.finishTests();
+ }
+
+function sendMouseEvent(t, elem) {
+  var r = elem.getBoundingClientRect();
+  synthesizeMouse(elem, r.width / 2, r.height / 2, {type: t});
+}
+
+function compareSnapshots_(c1, c2, shouldBeIdentical, msg) {
+  var [correct, c1url, c2url] = compareSnapshots(c1, c2, shouldBeIdentical);
+  if (correct) {
+    if (shouldBeIdentical) {
+      window.opener.ok(true, msg + " - expected " + c1url);
+    } else {
+      window.opener.ok(true, msg + " - got " + c1url + " and " + c2url);
+    }
+  } else {
+    if (shouldBeIdentical) {
+      window.opener.ok(false, msg + " - expected " + c1url + " but got " + c2url);
+    } else {
+      window.opener.ok(false, msg + " - expected something other than " + c1url);
+    }
+  }
+}
+
+function takeSnapshot() {
+  var r = buttonRect();
+  adjustedRect = { left: r.left - 2, top: r.top - 2,
+                   width: r.width + 4, height: r.height + 4 };
+  return SpecialPowers.snapshotRect(window, adjustedRect);
+}
+
+function buttonRect() {
+  return button.getBoundingClientRect();
+}
+</script>
+</pre>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/content/events/test/bug656379-1.html
@@ -0,0 +1,181 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=656379
+-->
+<head>
+  <title>Test for Bug 656379</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+  <script type="application/javascript" src="/tests/SimpleTest/WindowSnapshot.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+  <style>
+    canvas {
+      display: none;
+    }
+    input[type=button] {
+      -moz-appearance: none;
+      padding: 0;
+      border: none;
+      color: black;
+      background: white;
+    }
+    input[type=button]::-moz-focus-inner { border: none; }
+
+    /* Make sure that normal, focused, hover+active, focused+hover+active
+       buttons all have different styles so that the test keeps moving along. */
+    input[type=button]:hover:active {
+      background: red;
+    }
+    input[type=button]:focus {
+      background: green;
+    }
+    input[type=button]:focus:hover:active {
+      background: purple;
+    }
+  </style>
+</head>
+<body onload="runTests()">
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=656379">Mozilla Bug 656379</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+  
+</div>
+<pre id="test">
+<script type="application/javascript;version=1.8">
+
+
+var normalButtonCanvas, pressedButtonCanvas, normalFocusedButtonCanvas,
+    pressedFocusedButtonCanvas, currentSnapshot, button, label, outside;
+
+function runTests() {
+  button = $("button");
+  label = $("label");
+  outside = $("outside");
+  SimpleTest.executeSoon(executeTests);
+}
+
+function isRectContainedInRectFromRegion(rect, region) {
+  return Array.some(region, function (r) {
+    return rect.left >= r.left &&
+           rect.top >= r.top &&
+           rect.right <= r.right &&
+           rect.bottom <= r.bottom;
+  });
+}
+
+function paintListener(e) {
+  netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+  if (isRectContainedInRectFromRegion(buttonRect(), e.clientRects)) {
+    gNeedsPaint = false;
+    currentSnapshot = takeSnapshot();
+  }
+}
+
+var gNeedsPaint = false;
+function executeTests() {
+  var testYielder = tests();
+  function execNext() {
+    try {
+      if (!gNeedsPaint) {
+        testYielder.next();
+        button.getBoundingClientRect(); // Flush.
+        gNeedsPaint = true;
+      }
+      SimpleTest.executeSoon(execNext);
+    } catch (e) {}
+  }
+  execNext();
+}
+
+function tests() {
+  window.addEventListener("MozAfterPaint", paintListener, false);
+  normalButtonCanvas = takeSnapshot();
+  // Press the button.
+  sendMouseEvent("mousemove", button);
+  sendMouseEvent("mousedown", button);
+  yield;
+  pressedFocusedButtonCanvas = takeSnapshot();
+  compareSnapshots_(normalButtonCanvas, pressedFocusedButtonCanvas, false, "Pressed focused buttons should look different from normal buttons.");
+  // Release.
+  sendMouseEvent("mouseup", button);
+  yield;
+  // make sure the button is focused as this doesn't happen on click on Mac
+  button.focus();
+  normalFocusedButtonCanvas = takeSnapshot();
+  compareSnapshots_(normalFocusedButtonCanvas, pressedFocusedButtonCanvas, false, "Pressed focused buttons should look different from normal focused buttons.");
+  // Unfocus the button.
+  sendMouseEvent("mousedown", outside);
+  sendMouseEvent("mouseup", outside);
+  yield;
+
+  // Press the label.
+  sendMouseEvent("mousemove", label);
+  sendMouseEvent("mousedown", label);
+  yield;
+  compareSnapshots_(normalButtonCanvas, currentSnapshot, false, "Pressing the label should have pressed the button.");
+  pressedButtonCanvas = takeSnapshot();
+  // Move the mouse down from the label.
+  sendMouseEvent("mousemove", outside);
+  yield;
+  compareSnapshots_(normalButtonCanvas, currentSnapshot, true, "Moving the mouse down from the label should have unpressed the button.");
+  // ... and up again.
+  sendMouseEvent("mousemove", label);
+  yield;
+  compareSnapshots_(pressedButtonCanvas, currentSnapshot, true, "Moving the mouse back on top of the label should have pressed the button.");
+  // Release.
+  sendMouseEvent("mouseup", label);
+  yield;
+  compareSnapshots_(normalFocusedButtonCanvas, currentSnapshot, true, "Releasing the mouse over the label should have unpressed (and focused) the button.");
+  // Press the label and remove it.
+  sendMouseEvent("mousemove", label);
+  sendMouseEvent("mousedown", label);
+  yield;
+  label.parentNode.removeChild(label);
+  yield;
+  compareSnapshots_(normalButtonCanvas, currentSnapshot, true, "Removing the label should have unpressed the button.");
+  sendMouseEvent("mouseup", label);
+  window.removeEventListener("MozAfterPaint", paintListener, false);
+  window.opener.finishTests();
+ }
+
+function sendMouseEvent(t, elem) {
+  var r = elem.getBoundingClientRect();
+  synthesizeMouse(elem, r.width / 2, r.height / 2, {type: t});
+}
+
+function compareSnapshots_(c1, c2, shouldBeIdentical, msg) {
+  var [correct, c1url, c2url] = compareSnapshots(c1, c2, shouldBeIdentical);
+  if (correct) {
+    if (shouldBeIdentical) {
+      window.opener.ok(true, msg + " - expected " + c1url);
+    } else {
+      window.opener.ok(true, msg + " - got " + c1url + " and " + c2url);
+    }
+  } else {
+    if (shouldBeIdentical) {
+      window.opener.ok(false, msg + " - expected " + c1url + " but got " + c2url);
+    } else {
+      window.opener.ok(false, msg + " - expected something other than " + c1url);
+    }
+  }
+}
+
+function takeSnapshot(canvas) {
+  var r = buttonRect();
+  adjustedRect = { left: r.left - 2, top: r.top - 2,
+                   width: r.width + 4, height: r.height + 4 };
+  return SpecialPowers.snapshotRect(window, adjustedRect);
+}
+
+function buttonRect() {
+  return button.getBoundingClientRect();
+}
+</script>
+</pre>
+<p><input type="button" value="Button" id="button"></p>
+<p><label for="button" id="label">Label</label></p>
+<p id="outside">Something under the label</p>
+
+</body>
+</html>
--- a/content/events/test/test_bug426082.html
+++ b/content/events/test/test_bug426082.html
@@ -4,161 +4,27 @@
 https://bugzilla.mozilla.org/show_bug.cgi?id=426082
 -->
 <head>
   <title>Test for Bug 426082</title>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
   <script type="application/javascript" src="/tests/SimpleTest/WindowSnapshot.js"></script>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
-  <style>
-    canvas {
-      display: none;
-    }
-  </style>
 </head>
-<body onload="runTests()">
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=426082">Mozilla Bug 426082</a>
-<p id="display"></p>
-<div id="content" style="display: none">
-  
-</div>
+<body>
+
 <pre id="test">
 <script type="application/javascript;version=1.8">
 
 /** Test for Bug 426082 **/
 SimpleTest.waitForExplicitFinish();
-
-var normalButtonCanvas, pressedButtonCanvas, normalFocusedButtonCanvas,
-    pressedFocusedButtonCanvas, currentSnapshot, button, label, outside;
-
-function runTests() {
-  button = $("button");
-  label = $("label");
-  outside = $("outside");
-  SimpleTest.executeSoon(executeTests);
-}
-
-function isRectContainedInRectFromRegion(rect, region) {
-  return Array.some(region, function (r) {
-    return rect.left >= r.left &&
-           rect.top >= r.top &&
-           rect.right <= r.right &&
-           rect.bottom <= r.bottom;
-  });
-}
-
-function paintListener(e) {
-  if (isRectContainedInRectFromRegion(buttonRect(), e.clientRects)) {
-    gNeedsPaint = false;
-    currentSnapshot = takeSnapshot();
-  }
-}
-
-var gNeedsPaint = false;
-function executeTests() {
-  var testYielder = tests();
-  function execNext() {
-    try {
-      if (!gNeedsPaint) {
-        testYielder.next();
-        button.getBoundingClientRect(); // Flush.
-        gNeedsPaint = true;
-      }
-      SimpleTest.executeSoon(execNext);
-    } catch (e) {}
-  }
-  execNext();
-}
+var subwindow = window.open("./bug426082.html", "bug426082", "width=800,height=1000");
 
-function tests() {
-  window.addEventListener("MozAfterPaint", paintListener, false);
-  normalButtonCanvas = takeSnapshot();
-  // Press the button.
-  sendMouseEvent("mousemove", button);
-  sendMouseEvent("mousedown", button);
-  yield;
-  pressedFocusedButtonCanvas = takeSnapshot();
-  compareSnapshots_(normalButtonCanvas, pressedFocusedButtonCanvas, false, "Pressed focused buttons should look different from normal buttons.");
-  // Release.
-  sendMouseEvent("mouseup", button);
-  yield;
-  // make sure the button is focused as this doesn't happen on click on Mac
-  button.focus();
-  normalFocusedButtonCanvas = takeSnapshot();
-  compareSnapshots_(normalFocusedButtonCanvas, pressedFocusedButtonCanvas, false, "Pressed focused buttons should look different from normal focused buttons.");
-  // Unfocus the button.
-  sendMouseEvent("mousedown", outside);
-  sendMouseEvent("mouseup", outside);
-  yield;
-
-  // Press the label.
-  sendMouseEvent("mousemove", label);
-  sendMouseEvent("mousedown", label);
-  yield;
-  compareSnapshots_(normalButtonCanvas, currentSnapshot, false, "Pressing the label should have pressed the button.");
-  pressedButtonCanvas = takeSnapshot();
-  // Move the mouse down from the label.
-  sendMouseEvent("mousemove", outside);
-  yield;
-  compareSnapshots_(normalButtonCanvas, currentSnapshot, true, "Moving the mouse down from the label should have unpressed the button.");
-  // ... and up again.
-  sendMouseEvent("mousemove", label);
-  yield;
-  compareSnapshots_(pressedButtonCanvas, currentSnapshot, true, "Moving the mouse back on top of the label should have pressed the button.");
-  // Release.
-  sendMouseEvent("mouseup", label);
-  yield;
-  compareSnapshots_(normalFocusedButtonCanvas, currentSnapshot, true, "Releasing the mouse over the label should have unpressed (and focused) the button.");
-  // Press the label and remove it.
-  sendMouseEvent("mousemove", label);
-  sendMouseEvent("mousedown", label);
-  yield;
-  label.parentNode.removeChild(label);
-  yield;
-  compareSnapshots_(normalButtonCanvas, currentSnapshot, true, "Removing the label should have unpressed the button.");
-  sendMouseEvent("mouseup", label);
-  window.removeEventListener("MozAfterPaint", paintListener, false);
+function finishTests() {
+  subwindow.close();
   SimpleTest.finish();
 }
-
-function sendMouseEvent(t, elem) {
-  var r = elem.getBoundingClientRect();
-  synthesizeMouse(elem, r.width / 2, r.height / 2, {type: t});
-}
-
-function compareSnapshots_(c1, c2, shouldBeIdentical, msg) {
-  var [correct, c1url, c2url] = compareSnapshots(c1, c2, shouldBeIdentical);
-  if (correct) {
-    if (shouldBeIdentical) {
-      ok(true, msg + " - expected " + c1url);
-    } else {
-      ok(true, msg + " - got " + c1url + " and " + c2url);
-    }
-  } else {
-    if (shouldBeIdentical) {
-      ok(false, msg + " - expected " + c1url + " but got " + c2url);
-    } else {
-      ok(false, msg + " - expected something other than " + c1url);
-    }
-  }
-}
-
-function takeSnapshot() {
-  var r = buttonRect();
-  adjustedRect = { left: r.left - 2, top: r.top - 2,
-                   width: r.width + 4, height: r.height + 4 };
-  return SpecialPowers.snapshotRect(window, adjustedRect);
-}
-
-function buttonRect() {
-  return button.getBoundingClientRect();
-}
-
-
 </script>
 </pre>
-<p><input type="button" value="Button" id="button"></p>
-<p><label for="button" id="label">Label</label></p>
-<p id="outside">Something under the label</p>
 
 </body>
 </html>
--- a/content/events/test/test_bug656379-1.html
+++ b/content/events/test/test_bug656379-1.html
@@ -4,181 +4,27 @@
 https://bugzilla.mozilla.org/show_bug.cgi?id=656379
 -->
 <head>
   <title>Test for Bug 656379</title>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
   <script type="application/javascript" src="/tests/SimpleTest/WindowSnapshot.js"></script>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
-  <style>
-    canvas {
-      display: none;
-    }
-    input[type=button] {
-      -moz-appearance: none;
-      padding: 0;
-      border: none;
-      color: black;
-      background: white;
-    }
-    input[type=button]::-moz-focus-inner { border: none; }
+</head>
+<body>
 
-    /* Make sure that normal, focused, hover+active, focused+hover+active
-       buttons all have different styles so that the test keeps moving along. */
-    input[type=button]:hover:active {
-      background: red;
-    }
-    input[type=button]:focus {
-      background: green;
-    }
-    input[type=button]:focus:hover:active {
-      background: purple;
-    }
-  </style>
-</head>
-<body onload="runTests()">
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=426082">Mozilla Bug 426082</a>
-<p id="display"></p>
-<div id="content" style="display: none">
-  
-</div>
 <pre id="test">
 <script type="application/javascript;version=1.8">
 
-/** Test for Bug 426082 **/
+/** Test for Bug 656379 **/
 SimpleTest.waitForExplicitFinish();
-
-var normalButtonCanvas, pressedButtonCanvas, normalFocusedButtonCanvas,
-    pressedFocusedButtonCanvas, currentSnapshot, button, label, outside;
-
-function runTests() {
-  button = $("button");
-  label = $("label");
-  outside = $("outside");
-  SimpleTest.executeSoon(executeTests);
-}
-
-function isRectContainedInRectFromRegion(rect, region) {
-  return Array.some(region, function (r) {
-    return rect.left >= r.left &&
-           rect.top >= r.top &&
-           rect.right <= r.right &&
-           rect.bottom <= r.bottom;
-  });
-}
-
-function paintListener(e) {
-  if (isRectContainedInRectFromRegion(buttonRect(), e.clientRects)) {
-    gNeedsPaint = false;
-    currentSnapshot = takeSnapshot();
-  }
-}
-
-var gNeedsPaint = false;
-function executeTests() {
-  var testYielder = tests();
-  function execNext() {
-    try {
-      if (!gNeedsPaint) {
-        testYielder.next();
-        button.getBoundingClientRect(); // Flush.
-        gNeedsPaint = true;
-      }
-      SimpleTest.executeSoon(execNext);
-    } catch (e) {}
-  }
-  execNext();
-}
+var subwindow = window.open("./bug656379-1.html", "bug656379", "width=800,height=1000");
 
-function tests() {
-  window.addEventListener("MozAfterPaint", paintListener, false);
-  normalButtonCanvas = takeSnapshot();
-  // Press the button.
-  sendMouseEvent("mousemove", button);
-  sendMouseEvent("mousedown", button);
-  yield;
-  pressedFocusedButtonCanvas = takeSnapshot();
-  compareSnapshots_(normalButtonCanvas, pressedFocusedButtonCanvas, false, "Pressed focused buttons should look different from normal buttons.");
-  // Release.
-  sendMouseEvent("mouseup", button);
-  yield;
-  // make sure the button is focused as this doesn't happen on click on Mac
-  button.focus();
-  normalFocusedButtonCanvas = takeSnapshot();
-  compareSnapshots_(normalFocusedButtonCanvas, pressedFocusedButtonCanvas, false, "Pressed focused buttons should look different from normal focused buttons.");
-  // Unfocus the button.
-  sendMouseEvent("mousedown", outside);
-  sendMouseEvent("mouseup", outside);
-  yield;
-
-  // Press the label.
-  sendMouseEvent("mousemove", label);
-  sendMouseEvent("mousedown", label);
-  yield;
-  compareSnapshots_(normalButtonCanvas, currentSnapshot, false, "Pressing the label should have pressed the button.");
-  pressedButtonCanvas = takeSnapshot();
-  // Move the mouse down from the label.
-  sendMouseEvent("mousemove", outside);
-  yield;
-  compareSnapshots_(normalButtonCanvas, currentSnapshot, true, "Moving the mouse down from the label should have unpressed the button.");
-  // ... and up again.
-  sendMouseEvent("mousemove", label);
-  yield;
-  compareSnapshots_(pressedButtonCanvas, currentSnapshot, true, "Moving the mouse back on top of the label should have pressed the button.");
-  // Release.
-  sendMouseEvent("mouseup", label);
-  yield;
-  compareSnapshots_(normalFocusedButtonCanvas, currentSnapshot, true, "Releasing the mouse over the label should have unpressed (and focused) the button.");
-  // Press the label and remove it.
-  sendMouseEvent("mousemove", label);
-  sendMouseEvent("mousedown", label);
-  yield;
-  label.parentNode.removeChild(label);
-  yield;
-  compareSnapshots_(normalButtonCanvas, currentSnapshot, true, "Removing the label should have unpressed the button.");
-  sendMouseEvent("mouseup", label);
-  window.removeEventListener("MozAfterPaint", paintListener, false);
+function finishTests() {
+  subwindow.close();
   SimpleTest.finish();
 }
-
-function sendMouseEvent(t, elem) {
-  var r = elem.getBoundingClientRect();
-  synthesizeMouse(elem, r.width / 2, r.height / 2, {type: t});
-}
-
-function compareSnapshots_(c1, c2, shouldBeIdentical, msg) {
-  var [correct, c1url, c2url] = compareSnapshots(c1, c2, shouldBeIdentical);
-  if (correct) {
-    if (shouldBeIdentical) {
-      ok(true, msg + " - expected " + c1url);
-    } else {
-      ok(true, msg + " - got " + c1url + " and " + c2url);
-    }
-  } else {
-    if (shouldBeIdentical) {
-      ok(false, msg + " - expected " + c1url + " but got " + c2url);
-    } else {
-      ok(false, msg + " - expected something other than " + c1url);
-    }
-  }
-}
-
-function takeSnapshot(canvas) {
-  var r = buttonRect();
-  adjustedRect = { left: r.left - 2, top: r.top - 2,
-                   width: r.width + 4, height: r.height + 4 };
-  return SpecialPowers.snapshotRect(window, adjustedRect);
-}
-
-function buttonRect() {
-  return button.getBoundingClientRect();
-}
-
-
 </script>
 </pre>
-<p><input type="button" value="Button" id="button"></p>
-<p><label for="button" id="label">Label</label></p>
-<p id="outside">Something under the label</p>
 
 </body>
 </html>
--- a/content/html/content/src/nsHTMLCanvasElement.cpp
+++ b/content/html/content/src/nsHTMLCanvasElement.cpp
@@ -540,17 +540,17 @@ nsHTMLCanvasElement::ToDataURLImpl(const
     aDataURL = NS_LITERAL_STRING("data:image/png;base64,");
   else
     aDataURL = NS_LITERAL_STRING("data:") + type +
       NS_LITERAL_STRING(";base64,");
 
   uint64_t count;
   rv = stream->Available(&count);
   NS_ENSURE_SUCCESS(rv, rv);
-  NS_ENSURE_TRUE(count <= PR_UINT32_MAX, NS_ERROR_FILE_TOO_BIG);
+  NS_ENSURE_TRUE(count <= UINT32_MAX, NS_ERROR_FILE_TOO_BIG);
 
   return Base64EncodeInputStream(stream, aDataURL, (uint32_t)count, aDataURL.Length());
 }
 
 NS_IMETHODIMP
 nsHTMLCanvasElement::MozGetAsFile(const nsAString& aName,
                                   const nsAString& aType,
                                   uint8_t optional_argc,
@@ -580,17 +580,17 @@ nsHTMLCanvasElement::MozGetAsFileImpl(co
   nsAutoString type(aType);
   if (fallbackToPNG) {
     type.AssignLiteral("image/png");
   }
 
   uint64_t imgSize;
   rv = stream->Available(&imgSize);
   NS_ENSURE_SUCCESS(rv, rv);
-  NS_ENSURE_TRUE(imgSize <= PR_UINT32_MAX, NS_ERROR_FILE_TOO_BIG);
+  NS_ENSURE_TRUE(imgSize <= UINT32_MAX, NS_ERROR_FILE_TOO_BIG);
 
   void* imgData = nullptr;
   rv = NS_ReadInputStreamToBuffer(stream, &imgData, (uint32_t)imgSize);
   NS_ENSURE_SUCCESS(rv, rv);
 
   // The DOMFile takes ownership of the buffer
   nsRefPtr<nsDOMMemoryFile> file =
     new nsDOMMemoryFile(imgData, (uint32_t)imgSize, aName, type);
@@ -831,42 +831,33 @@ nsHTMLCanvasElement::InvalidateCanvasCon
   // We don't need to flush anything here; if there's no frame or if
   // we plan to reframe we don't need to invalidate it anyway.
   nsIFrame *frame = GetPrimaryFrame();
   if (!frame)
     return;
 
   frame->MarkLayersActive(nsChangeHint(0));
 
-  nsRect invalRect;
-  nsRect contentArea = frame->GetContentRect();
+  Layer* layer;
   if (damageRect) {
     nsIntSize size = GetWidthHeight();
     if (size.width != 0 && size.height != 0) {
 
-      // damageRect and size are in CSS pixels; contentArea is in appunits
-      // We want a rect in appunits; so avoid doing pixels-to-appunits and
-      // vice versa conversion here.
       gfxRect realRect(*damageRect);
-      realRect.Scale(contentArea.width / gfxFloat(size.width),
-                     contentArea.height / gfxFloat(size.height));
       realRect.RoundOut();
 
       // then make it a nsRect
-      invalRect = nsRect(realRect.X(), realRect.Y(),
-                         realRect.Width(), realRect.Height());
+      nsIntRect invalRect(realRect.X(), realRect.Y(),
+                          realRect.Width(), realRect.Height());
 
-      invalRect = invalRect.Intersect(nsRect(nsPoint(0,0), contentArea.Size()));
+      layer = frame->InvalidateLayer(nsDisplayItem::TYPE_CANVAS, &invalRect);
     }
   } else {
-    invalRect = nsRect(nsPoint(0, 0), contentArea.Size());
+    layer = frame->InvalidateLayer(nsDisplayItem::TYPE_CANVAS);
   }
-  invalRect.MoveBy(contentArea.TopLeft() - frame->GetPosition());
-
-  Layer* layer = frame->InvalidateLayer(invalRect, nsDisplayItem::TYPE_CANVAS);
   if (layer) {
     static_cast<CanvasLayer*>(layer)->Updated();
   }
 
   /*
    * Treat canvas invalidations as animation activity for JS. Frequently
    * invalidating a canvas will feed into heuristics and cause JIT code to be
    * kept around longer, for smoother animations.
@@ -884,17 +875,17 @@ void
 nsHTMLCanvasElement::InvalidateCanvas()
 {
   // We don't need to flush anything here; if there's no frame or if
   // we plan to reframe we don't need to invalidate it anyway.
   nsIFrame *frame = GetPrimaryFrame();
   if (!frame)
     return;
 
-  frame->Invalidate(frame->GetContentRect() - frame->GetPosition());
+  frame->InvalidateFrame();
 }
 
 int32_t
 nsHTMLCanvasElement::CountContexts()
 {
   if (mCurrentContext)
     return 1;
 
--- a/content/media/AudioSegment.cpp
+++ b/content/media/AudioSegment.cpp
@@ -156,17 +156,17 @@ static const int STATIC_AUDIO_BUFFER_BYT
 void
 AudioSegment::WriteTo(nsAudioStream* aOutput)
 {
   NS_ASSERTION(mChannels == aOutput->GetChannels(), "Wrong number of channels");
   nsAutoTArray<uint8_t,STATIC_AUDIO_BUFFER_BYTES> buf;
   uint32_t frameSize = GetSampleSize(aOutput->GetFormat())*mChannels;
   for (ChunkIterator ci(*this); !ci.IsEnded(); ci.Next()) {
     AudioChunk& c = *ci;
-    if (frameSize*c.mDuration > PR_UINT32_MAX) {
+    if (frameSize*c.mDuration > UINT32_MAX) {
       NS_ERROR("Buffer overflow");
       return;
     }
     buf.SetLength(int32_t(frameSize*c.mDuration));
     if (c.mBuffer) {
       InterleaveAndConvertBuffer(c.mBuffer->Data(), c.mBufferFormat, c.mBufferLength,
                                  c.mOffset, int32_t(c.mDuration),
                                  c.mVolume,
--- a/content/media/FileBlockCache.cpp
+++ b/content/media/FileBlockCache.cpp
@@ -233,17 +233,17 @@ nsresult FileBlockCache::Run()
 
 nsresult FileBlockCache::Read(int64_t aOffset,
                               uint8_t* aData,
                               int32_t aLength,
                               int32_t* aBytes)
 {
   MonitorAutoLock mon(mDataMonitor);
 
-  if (!mFD || (aOffset / BLOCK_SIZE) > PR_INT32_MAX)
+  if (!mFD || (aOffset / BLOCK_SIZE) > INT32_MAX)
     return NS_ERROR_FAILURE;
 
   int32_t bytesToRead = aLength;
   int64_t offset = aOffset;
   uint8_t* dst = aData;
   while (bytesToRead > 0) {
     int32_t blockIndex = static_cast<int32_t>(offset / BLOCK_SIZE);
     int32_t start = offset % BLOCK_SIZE;
--- a/content/media/MediaResource.cpp
+++ b/content/media/MediaResource.cpp
@@ -1064,17 +1064,17 @@ void FileMediaResource::EnsureSizeInitia
   NS_ASSERTION(mInput, "Must have file input stream");
   if (mSizeInitialized) {
     return;
   }
   mSizeInitialized = true;
   // Get the file size and inform the decoder.
   uint64_t size;
   nsresult res = mInput->Available(&size);
-  if (NS_SUCCEEDED(res) && size <= PR_INT64_MAX) {
+  if (NS_SUCCEEDED(res) && size <= INT64_MAX) {
     mSize = (int64_t)size;
     nsCOMPtr<nsIRunnable> event = new LoadedEvent(mDecoder);
     NS_DispatchToMainThread(event, NS_DISPATCH_NORMAL);
   }
 }
 
 nsresult FileMediaResource::GetCachedRanges(nsTArray<MediaByteRange>& aRanges)
 {
--- a/content/media/MediaSegment.h
+++ b/content/media/MediaSegment.h
@@ -11,17 +11,17 @@
 namespace mozilla {
 
 /**
  * We represent media times in 64-bit fixed point. So 1 MediaTime is
  * 1/(2^MEDIA_TIME_FRAC_BITS) seconds.
  */
 typedef int64_t MediaTime;
 const int64_t MEDIA_TIME_FRAC_BITS = 20;
-const int64_t MEDIA_TIME_MAX = PR_INT64_MAX;
+const int64_t MEDIA_TIME_MAX = INT64_MAX;
 
 inline MediaTime MillisecondsToMediaTime(int32_t aMS)
 {
   return (MediaTime(aMS) << MEDIA_TIME_FRAC_BITS)/1000;
 }
 
 inline MediaTime SecondsToMediaTime(double aS)
 {
@@ -36,17 +36,17 @@ inline double MediaTimeToSeconds(MediaTi
 }
 
 /**
  * A number of ticks at a rate determined by some underlying track (e.g.
  * audio sample rate). We want to make sure that multiplying TrackTicks by
  * 2^MEDIA_TIME_FRAC_BITS doesn't overflow, so we set its max accordingly.
  */
 typedef int64_t TrackTicks;
-const int64_t TRACK_TICKS_MAX = PR_INT64_MAX >> MEDIA_TIME_FRAC_BITS;
+const int64_t TRACK_TICKS_MAX = INT64_MAX >> MEDIA_TIME_FRAC_BITS;
 
 /**
  * A MediaSegment is a chunk of media data sequential in time. Different
  * types of data have different subclasses of MediaSegment, all inheriting
  * from MediaSegmentBase.
  * All MediaSegment data is timed using TrackTicks. The actual tick rate
  * is defined on a per-track basis. For some track types, this can be
  * a fixed constant for all tracks of that type (e.g. 1MHz for video).
--- a/content/media/TimeVarying.h
+++ b/content/media/TimeVarying.h
@@ -76,23 +76,23 @@ public:
       }
       mChanges.RemoveElementAt(i);
     }
     mChanges.InsertElementAt(0, Entry(aTime, aValue));
   }
   /**
    * Returns the final value of the function. If aTime is non-null,
    * sets aTime to the time at which the function changes to that final value.
-   * If there are no changes after the current time, returns PR_INT64_MIN in aTime.
+   * If there are no changes after the current time, returns INT64_MIN in aTime.
    */
   const T& GetLast(Time* aTime = nullptr) const
   {
     if (mChanges.IsEmpty()) {
       if (aTime) {
-        *aTime = PR_INT64_MIN;
+        *aTime = INT64_MIN;
       }
       return mCurrent;
     }
     if (aTime) {
       *aTime = mChanges[mChanges.Length() - 1].mTime;
     }
     return mChanges[mChanges.Length() - 1].mValue;
   }
@@ -114,39 +114,39 @@ public:
                      "Only changed values appear in array");
         return mChanges[i - 1].mValue;
       }
     }
   }
   /**
    * Returns the value of the function at time aTime.
    * If aEnd is non-null, sets *aEnd to the time at which the function will
-   * change from the returned value to a new value, or PR_INT64_MAX if that
+   * change from the returned value to a new value, or INT64_MAX if that
    * never happens.
    * If aStart is non-null, sets *aStart to the time at which the function
-   * changed to the returned value, or PR_INT64_MIN if that happened at or
+   * changed to the returned value, or INT64_MIN if that happened at or
    * before the current time.
    *
    * Currently uses a linear search, but could use a binary search.
    */
   const T& GetAt(Time aTime, Time* aEnd = nullptr, Time* aStart = nullptr) const
   {
     if (mChanges.IsEmpty() || aTime < mChanges[0].mTime) {
       if (aStart) {
-        *aStart = PR_INT64_MIN;
+        *aStart = INT64_MIN;
       }
       if (aEnd) {
-        *aEnd = mChanges.IsEmpty() ? PR_INT64_MAX : mChanges[0].mTime;
+        *aEnd = mChanges.IsEmpty() ? INT64_MAX : mChanges[0].mTime;
       }
       return mCurrent;
     }
     int32_t changesLength = mChanges.Length();
     if (mChanges[changesLength - 1].mTime <= aTime) {
       if (aEnd) {
-        *aEnd = PR_INT64_MAX;
+        *aEnd = INT64_MAX;
       }
       if (aStart) {
         *aStart = mChanges[changesLength - 1].mTime;
       }
       return mChanges[changesLength - 1].mValue;
     }
 
     for (uint32_t i = 1; ; ++i) {
--- a/content/media/VideoFrameContainer.cpp
+++ b/content/media/VideoFrameContainer.cpp
@@ -126,20 +126,19 @@ void VideoFrameContainer::Invalidate()
         presShell->FrameNeedsReflow(frame,
                                     nsIPresShell::eStyleChange,
                                     NS_FRAME_IS_DIRTY);
       }
     }
   }
 
   if (frame) {
-    nsRect contentRect = frame->GetContentRect() - frame->GetPosition();
     if (invalidateFrame) {
-      frame->Invalidate(contentRect);
+      frame->InvalidateFrame();
     } else {
-      frame->InvalidateLayer(contentRect, nsDisplayItem::TYPE_VIDEO);
+      frame->InvalidateLayer(nsDisplayItem::TYPE_VIDEO);
     }
   }
 
   nsSVGEffects::InvalidateDirectRenderingObservers(mElement);
 }
 
 }
--- a/content/media/VideoUtils.cpp
+++ b/content/media/VideoUtils.cpp
@@ -20,17 +20,17 @@ CheckedInt64 FramesToUsecs(int64_t aFram
 // audio rate.
 CheckedInt64 UsecsToFrames(int64_t aUsecs, uint32_t aRate) {
   return (CheckedInt64(aUsecs) * aRate) / USECS_PER_S;
 }
 
 static int32_t ConditionDimension(float aValue)
 {
   // This will exclude NaNs and too-big values.
-  if (aValue > 1.0 && aValue <= PR_INT32_MAX)
+  if (aValue > 1.0 && aValue <= INT32_MAX)
     return int32_t(NS_round(aValue));
   return 0;
 }
 
 void ScaleDisplayByAspectRatio(nsIntSize& aDisplay, float aAspectRatio)
 {
   if (aAspectRatio > 1.0) {
     // Increase the intrinsic width
--- a/content/media/nsAudioStream.cpp
+++ b/content/media/nsAudioStream.cpp
@@ -604,17 +604,17 @@ bool nsNativeAudioStream::IsPaused()
 
 int32_t nsNativeAudioStream::GetMinWriteSize()
 {
   size_t size;
   int r = sa_stream_get_min_write(static_cast<sa_stream_t*>(mAudioHandle),
                                   &size);
   if (r == SA_ERROR_NOT_SUPPORTED)
     return 1;
-  else if (r != SA_SUCCESS || size > PR_INT32_MAX)
+  else if (r != SA_SUCCESS || size > INT32_MAX)
     return -1;
 
   return static_cast<int32_t>(size / mChannels / sizeof(short));
 }
 
 #if defined(REMOTE_AUDIO)
 nsRemotedAudioStream::nsRemotedAudioStream()
  : mAudioChild(nullptr),
@@ -1147,17 +1147,17 @@ nsBufferedAudioStream::GetPositionInFram
   }
 
   // Adjust the reported position by the number of silent frames written
   // during stream underruns.
   uint64_t adjustedPosition = 0;
   if (position >= mLostFrames) {
     adjustedPosition = position - mLostFrames;
   }
-  return NS_MIN<uint64_t>(adjustedPosition, PR_INT64_MAX);
+  return NS_MIN<uint64_t>(adjustedPosition, INT64_MAX);
 }
 
 bool
 nsBufferedAudioStream::IsPaused()
 {
   MonitorAutoLock mon(mMonitor);
   return mState == STOPPED;
 }
--- a/content/media/nsBuiltinDecoderReader.cpp
+++ b/content/media/nsBuiltinDecoderReader.cpp
@@ -17,17 +17,17 @@
 using namespace mozilla;
 using mozilla::layers::ImageContainer;
 using mozilla::layers::PlanarYCbCrImage;
 
 // Verify these values are sane. Once we've checked the frame sizes, we then
 // can do less integer overflow checking.
 PR_STATIC_ASSERT(MAX_VIDEO_WIDTH < PlanarYCbCrImage::MAX_DIMENSION);
 PR_STATIC_ASSERT(MAX_VIDEO_HEIGHT < PlanarYCbCrImage::MAX_DIMENSION);
-PR_STATIC_ASSERT(PlanarYCbCrImage::MAX_DIMENSION < PR_UINT32_MAX / PlanarYCbCrImage::MAX_DIMENSION);
+PR_STATIC_ASSERT(PlanarYCbCrImage::MAX_DIMENSION < UINT32_MAX / PlanarYCbCrImage::MAX_DIMENSION);
 
 // Un-comment to enable logging of seek bisections.
 //#define SEEK_LOGGING
 
 #ifdef PR_LOGGING
 extern PRLogModuleInfo* gBuiltinDecoderLog;
 #define LOG(type, msg) PR_LOG(gBuiltinDecoderLog, type, msg)
 #ifdef SEEK_LOGGING
--- a/content/media/nsBuiltinDecoderStateMachine.cpp
+++ b/content/media/nsBuiltinDecoderStateMachine.cpp
@@ -583,17 +583,17 @@ void nsBuiltinDecoderStateMachine::SendS
 
   DecodedStreamData* stream = mDecoder->GetDecodedStream();
   if (!stream)
     return;
 
   if (mState == DECODER_STATE_DECODING_METADATA)
     return;
 
-  int64_t minLastAudioPacketTime = PR_INT64_MAX;
+  int64_t minLastAudioPacketTime = INT64_MAX;
   SourceMediaStream* mediaStream = stream->mStream;
   StreamTime endPosition = 0;
 
   if (!stream->mStreamInitialized) {
     if (mInfo.mHasAudio) {
       AudioSegment* audio = new AudioSegment();
       audio->Init(mInfo.mAudioChannels);
       mediaStream->AddTrack(TRACK_AUDIO, mInfo.mAudioRate, 0, audio);
@@ -1101,17 +1101,17 @@ void nsBuiltinDecoderStateMachine::Audio
         if (minWriteFrames > 1 && unplayedFrames > 0) {
           // Sound is written by libsydneyaudio to the hardware in blocks of
           // frames of size minWriteFrames. So if the number of frames we've
           // written isn't an exact multiple of minWriteFrames, we'll have
           // left over audio data which hasn't yet been written to the hardware,
           // and so that audio will not start playing. Write silence to ensure
           // the last block gets pushed to hardware, so that playback starts.
           int64_t framesToWrite = minWriteFrames - unplayedFrames;
-          if (framesToWrite < PR_UINT32_MAX / channels) {
+          if (framesToWrite < UINT32_MAX / channels) {
             // Write silence manually rather than using PlaySilence(), so that
             // the AudioAPI doesn't get a copy of the audio frames.
             ReentrantMonitorAutoExit exit(mDecoder->GetReentrantMonitor());
             WriteSilence(mAudioStream, framesToWrite);
           }
         }
 
         int64_t oldPosition = -1;
@@ -2340,17 +2340,17 @@ void nsBuiltinDecoderStateMachine::Wait(
   TimeStamp now;
   while ((now = TimeStamp::Now()) < end &&
          mState != DECODER_STATE_SHUTDOWN &&
          mState != DECODER_STATE_SEEKING &&
          !mStopAudioThread &&
          IsPlaying())
   {
     int64_t ms = static_cast<int64_t>(NS_round((end - now).ToSeconds() * 1000));
-    if (ms == 0 || ms > PR_UINT32_MAX) {
+    if (ms == 0 || ms > UINT32_MAX) {
       break;
     }
     mDecoder->GetReentrantMonitor().Wait(PR_MillisecondsToInterval(static_cast<uint32_t>(ms)));
   }
 }
 
 VideoData* nsBuiltinDecoderStateMachine::FindStartTime()
 {
@@ -2538,17 +2538,17 @@ void nsBuiltinDecoderStateMachine::Sched
 nsresult nsBuiltinDecoderStateMachine::ScheduleStateMachine(int64_t aUsecs) {
   mDecoder->GetReentrantMonitor().AssertCurrentThreadIn();
   NS_ABORT_IF_FALSE(GetStateMachineThread(),
     "Must have a state machine thread to schedule");
 
   if (mState == DECODER_STATE_SHUTDOWN) {
     return NS_ERROR_FAILURE;
   }
-  aUsecs = PR_MAX(aUsecs, 0);
+  aUsecs = NS_MAX<int64_t>(aUsecs, 0);
 
   TimeStamp timeout = TimeStamp::Now() + UsecsToDuration(aUsecs);
   if (!mTimeout.IsNull()) {
     if (timeout >= mTimeout) {
       // We've already scheduled a timer set to expire at or before this time,
       // or have an event dispatched to run the state machine.
       return NS_OK;
     }
--- a/content/media/nsMediaCache.cpp
+++ b/content/media/nsMediaCache.cpp
@@ -680,27 +680,27 @@ nsMediaCache::ReadCacheFileAllBytes(int6
 static int32_t GetMaxBlocks()
 {
   // We look up the cache size every time. This means dynamic changes
   // to the pref are applied.
   // Cache size is in KB
   int32_t cacheSize = Preferences::GetInt("media.cache_size", 500*1024);
   int64_t maxBlocks = static_cast<int64_t>(cacheSize)*1024/nsMediaCache::BLOCK_SIZE;
   maxBlocks = NS_MAX<int64_t>(maxBlocks, 1);
-  return int32_t(NS_MIN<int64_t>(maxBlocks, PR_INT32_MAX));
+  return int32_t(NS_MIN<int64_t>(maxBlocks, INT32_MAX));
 }
 
 int32_t
 nsMediaCache::FindBlockForIncomingData(TimeStamp aNow,
                                        nsMediaCacheStream* aStream)
 {
   mReentrantMonitor.AssertCurrentThreadIn();
 
   int32_t blockIndex = FindReusableBlock(aNow, aStream,
-      aStream->mChannelOffset/BLOCK_SIZE, PR_INT32_MAX);
+      aStream->mChannelOffset/BLOCK_SIZE, INT32_MAX);
 
   if (blockIndex < 0 || !IsBlockFree(blockIndex)) {
     // The block returned is already allocated.
     // Don't reuse it if a) there's room to expand the cache or
     // b) the data we're going to store in the free block is not higher
     // priority than the data already stored in the free block.
     // The latter can lead us to go over the cache limit a bit.
     if ((mIndex.Length() < uint32_t(GetMaxBlocks()) || blockIndex < 0 ||
@@ -984,17 +984,17 @@ nsMediaCache::PredictNextUse(TimeStamp a
     case READAHEAD_BLOCK: {
       int64_t bytesAhead =
         static_cast<int64_t>(bo->mStreamBlock)*BLOCK_SIZE - bo->mStream->mStreamOffset;
       NS_ASSERTION(bytesAhead >= 0,
                    "Readahead block before the current stream position?");
       int64_t millisecondsAhead =
         bytesAhead*1000/bo->mStream->mPlaybackBytesPerSecond;
       prediction = TimeDuration::FromMilliseconds(
-          NS_MIN<int64_t>(millisecondsAhead, PR_INT32_MAX));
+          NS_MIN<int64_t>(millisecondsAhead, INT32_MAX));
       break;
     }
     default:
       NS_ERROR("Invalid class for predicting next use");
       return TimeDuration(0);
     }
     if (i == 0 || prediction < result) {
       result = prediction;
@@ -1012,17 +1012,17 @@ nsMediaCache::PredictNextUseForIncomingD
   if (bytesAhead <= -BLOCK_SIZE) {
     // Hmm, no idea when data behind us will be used. Guess 24 hours.
     return TimeDuration::FromSeconds(24*60*60);
   }
   if (bytesAhead <= 0)
     return TimeDuration(0);
   int64_t millisecondsAhead = bytesAhead*1000/aStream->mPlaybackBytesPerSecond;
   return TimeDuration::FromMilliseconds(
-      NS_MIN<int64_t>(millisecondsAhead, PR_INT32_MAX));
+      NS_MIN<int64_t>(millisecondsAhead, INT32_MAX));
 }
 
 enum StreamAction { NONE, SEEK, SEEK_AND_RESUME, RESUME, SUSPEND };
 
 void
 nsMediaCache::Update()
 {
   NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
@@ -2093,17 +2093,17 @@ nsMediaCacheStream::Read(char* aBuffer, 
       // Don't try to read beyond the end of the stream
       int64_t bytesRemaining = mStreamLength - mStreamOffset;
       if (bytesRemaining <= 0) {
         // Get out of here and return NS_OK
         break;
       }
       size = NS_MIN(size, bytesRemaining);
       // Clamp size until 64-bit file size issues (bug 500784) are fixed.
-      size = NS_MIN(size, int64_t(PR_INT32_MAX));
+      size = NS_MIN(size, int64_t(INT32_MAX));
     }
 
     int32_t bytes;
     int32_t cacheBlock = streamBlock < mBlocks.Length() ? mBlocks[streamBlock] : -1;
     if (cacheBlock < 0) {
       // We don't have a complete cached block here.
 
       if (count > 0) {
@@ -2148,17 +2148,17 @@ nsMediaCacheStream::Read(char* aBuffer, 
         return NS_ERROR_FAILURE;
       }
       continue;
     }
 
     gMediaCache->NoteBlockUsage(this, cacheBlock, mCurrentMode, TimeStamp::Now());
 
     int64_t offset = cacheBlock*BLOCK_SIZE + offsetInStreamBlock;
-    NS_ABORT_IF_FALSE(size >= 0 && size <= PR_INT32_MAX, "Size out of range.");
+    NS_ABORT_IF_FALSE(size >= 0 && size <= INT32_MAX, "Size out of range.");
     nsresult rv = gMediaCache->ReadCacheFile(offset, aBuffer + count, int32_t(size), &bytes);
     if (NS_FAILED(rv)) {
       if (count == 0)
         return rv;
       // If we did successfully read some data, may as well return it
       break;
     }
     mStreamOffset += bytes;
@@ -2197,17 +2197,17 @@ nsMediaCacheStream::ReadFromCache(char* 
     if (mStreamLength >= 0) {
       // Don't try to read beyond the end of the stream
       int64_t bytesRemaining = mStreamLength - streamOffset;
       if (bytesRemaining <= 0) {
         return NS_ERROR_FAILURE;
       }
       size = NS_MIN(size, bytesRemaining);
       // Clamp size until 64-bit file size issues (bug 500784) are fixed.
-      size = NS_MIN(size, int64_t(PR_INT32_MAX));
+      size = NS_MIN(size, int64_t(INT32_MAX));
     }
 
     int32_t bytes;
     uint32_t channelBlock = uint32_t(mChannelOffset/BLOCK_SIZE);
     int32_t cacheBlock = streamBlock < mBlocks.Length() ? mBlocks[streamBlock] : -1;
     if (channelBlock == streamBlock && streamOffset < mChannelOffset) {
       // We can just use the data in mPartialBlockBuffer. In fact we should
       // use it rather than waiting for the block to fill and land in
@@ -2216,17 +2216,17 @@ nsMediaCacheStream::ReadFromCache(char* 
       memcpy(aBuffer + count,
         reinterpret_cast<char*>(mPartialBlockBuffer) + offsetInStreamBlock, bytes);
     } else {
       if (cacheBlock < 0) {
         // We expect all blocks to be cached! Fail!
         return NS_ERROR_FAILURE;
       }
       int64_t offset = cacheBlock*BLOCK_SIZE + offsetInStreamBlock;
-      NS_ABORT_IF_FALSE(size >= 0 && size <= PR_INT32_MAX, "Size out of range.");
+      NS_ABORT_IF_FALSE(size >= 0 && size <= INT32_MAX, "Size out of range.");
       nsresult rv = gMediaCache->ReadCacheFile(offset, aBuffer + count, int32_t(size), &bytes);
       if (NS_FAILED(rv)) {
         return rv;
       }
     }
     streamOffset += bytes;
     count += bytes;
   }
--- a/content/media/ogg/nsOggCodecState.cpp
+++ b/content/media/ogg/nsOggCodecState.cpp
@@ -928,17 +928,17 @@ bool nsOpusState::DecodeHeader(ogg_packe
 #endif
       mPreSkip = LEUint16(aPacket->packet + 10);
       mNominalRate = LEUint32(aPacket->packet + 12);
       double gain_dB = LEInt16(aPacket->packet + 16) / 256.0;
 #ifdef MOZ_SAMPLE_TYPE_FLOAT32
       mGain = static_cast<float>(pow(10,0.05*gain_dB));
 #else
       mGain_Q16 = static_cast<int32_t>(NS_MIN(65536*pow(10,0.05*gain_dB)+0.5,
-                                              static_cast<double>(PR_INT32_MAX)));
+                                              static_cast<double>(INT32_MAX)));
 #endif
       mChannelMapping = aPacket->packet[18];
 
       if (mChannelMapping == 0) {
         mStreams = 1;
         mCoupledStreams = mChannels - 1;
         mMappingTable[0] = 0;
         mMappingTable[1] = 1;
@@ -1136,17 +1136,17 @@ bool nsOpusState::ReconstructOpusGranule
       gp = mPrevPageGranulepos;
       // Loop through the packets forwards, adding the current packet's
       // duration to the previous granulepos to get the value for the
       // current packet.
       for (uint32_t i = 0; i < mUnstamped.Length() - 1; ++i) {
         ogg_packet* packet = mUnstamped[i];
         int offset = GetOpusDeltaGP(packet);
         // Check for error (negative offset) and overflow.
-        if (offset >= 0 && gp <= PR_INT64_MAX - offset) {
+        if (offset >= 0 && gp <= INT64_MAX - offset) {
           gp += offset;
           if (gp >= last_gp) {
             NS_WARNING("Opus end trimming removed more than a full packet.");
             // We were asked to remove a full packet's worth of data or more.
             // Encoders SHOULD NOT produce streams like this, but we'll handle
             // it for them anyway.
             gp = last_gp;
             for (uint32_t j = i+1; j < mUnstamped.Length(); ++j) {
--- a/content/media/ogg/nsOggReader.cpp
+++ b/content/media/ogg/nsOggReader.cpp
@@ -869,17 +869,17 @@ int64_t nsOggReader::RangeEndTime(int64_
         // an Ogg page into data we've previously scanned. Any data
         // between readLimitOffset and aEndOffset must be garbage
         // and we can ignore it thereafter.
         readLimitOffset = NS_MIN(readLimitOffset,
                                  readStartOffset + maxOggPageSize);
         readHead = NS_MAX(aStartOffset, readStartOffset);
       }
 
-      int64_t limit = NS_MIN(static_cast<int64_t>(PR_UINT32_MAX),
+      int64_t limit = NS_MIN(static_cast<int64_t>(UINT32_MAX),
                              aEndOffset - readHead);
       limit = NS_MAX(static_cast<int64_t>(0), limit);
       limit = NS_MIN(limit, static_cast<int64_t>(step));
       uint32_t bytesToRead = static_cast<uint32_t>(limit);
       uint32_t bytesRead = 0;
       char* buffer = ogg_sync_buffer(&sync.mState, bytesToRead);
       NS_ASSERTION(buffer, "Must have buffer");
       nsresult res;
@@ -1287,17 +1287,17 @@ PageSync(MediaResource* aResource,
     ret = ogg_sync_pageseek(aState, aPage);
     if (ret == 0) {
       char* buffer = ogg_sync_buffer(aState, PAGE_STEP);
       NS_ASSERTION(buffer, "Must have a buffer");
 
       // Read from the file into the buffer
       int64_t bytesToRead = NS_MIN(static_cast<int64_t>(PAGE_STEP),
                                    aEndOffset - readHead);
-      NS_ASSERTION(bytesToRead <= PR_UINT32_MAX, "bytesToRead range check");
+      NS_ASSERTION(bytesToRead <= UINT32_MAX, "bytesToRead range check");
       if (bytesToRead <= 0) {
         return PAGE_SYNC_END_OF_RANGE;
       }
       nsresult rv = NS_OK;
       if (aCachedDataOnly) {
         rv = aResource->ReadFromCache(buffer, readHead,
                                       static_cast<uint32_t>(bytesToRead));
         NS_ENSURE_SUCCESS(rv,PAGE_SYNC_ERROR);
@@ -1361,17 +1361,17 @@ nsresult nsOggReader::SeekBisection(int6
   ogg_int64_t endTime = aRange.mTimeEnd;
 
   ogg_int64_t seekTarget = aTarget;
   int64_t seekLowerBound = NS_MAX(static_cast<int64_t>(0), aTarget - aFuzz);
   int hops = 0;
   DebugOnly<ogg_int64_t> previousGuess = -1;
   int backsteps = 0;
   const int maxBackStep = 10;
-  NS_ASSERTION(static_cast<uint64_t>(PAGE_STEP) * pow(2.0, maxBackStep) < PR_INT32_MAX,
+  NS_ASSERTION(static_cast<uint64_t>(PAGE_STEP) * pow(2.0, maxBackStep) < INT32_MAX,
                "Backstep calculation must not overflow");
 
   // Seek via bisection search. Loop until we find the offset where the page
   // before the offset is before the seek target, and the page after the offset
   // is after the seek target.
   while (true) {
     ogg_int64_t duration = 0;
     double target = 0;
--- a/content/media/wave/nsWaveReader.cpp
+++ b/content/media/wave/nsWaveReader.cpp
@@ -174,37 +174,37 @@ bool nsWaveReader::DecodeAudioData()
   // convert data to samples
   const char* d = dataBuffer.get();
   AudioDataValue* s = sampleBuffer.get();
   for (int i = 0; i < frames; ++i) {
     for (unsigned int j = 0; j < mChannels; ++j) {
       if (mSampleFormat == nsAudioStream::FORMAT_U8) {
         uint8_t v =  ReadUint8(&d);
 #if defined(MOZ_SAMPLE_TYPE_S16)
-        *s++ = (v * (1.F/PR_UINT8_MAX)) * PR_UINT16_MAX + PR_INT16_MIN;
+        *s++ = (v * (1.F/UINT8_MAX)) * UINT16_MAX + INT16_MIN;
 #elif defined(MOZ_SAMPLE_TYPE_FLOAT32)
-        *s++ = (v * (1.F/PR_UINT8_MAX)) * 2.F - 1.F;
+        *s++ = (v * (1.F/UINT8_MAX)) * 2.F - 1.F;
 #endif
       }
       else if (mSampleFormat == nsAudioStream::FORMAT_S16) {
         int16_t v =  ReadInt16LE(&d);
 #if defined(MOZ_SAMPLE_TYPE_S16)
         *s++ = v;
 #elif defined(MOZ_SAMPLE_TYPE_FLOAT32)
-        *s++ = (int32_t(v) - PR_INT16_MIN) / float(PR_UINT16_MAX) * 2.F - 1.F;
+        *s++ = (int32_t(v) - INT16_MIN) / float(UINT16_MAX) * 2.F - 1.F;
 #endif
       }
     }
   }
 
   double posTime = BytesToTime(pos);
   double readSizeTime = BytesToTime(readSize);
   NS_ASSERTION(posTime <= INT64_MAX / USECS_PER_S, "posTime overflow");
   NS_ASSERTION(readSizeTime <= INT64_MAX / USECS_PER_S, "readSizeTime overflow");
-  NS_ASSERTION(frames < PR_INT32_MAX, "frames overflow");
+  NS_ASSERTION(frames < INT32_MAX, "frames overflow");
 
   mAudioQueue.Push(new AudioData(pos,
                                  static_cast<int64_t>(posTime * USECS_PER_S),
                                  static_cast<int64_t>(readSizeTime * USECS_PER_S),
                                  static_cast<int32_t>(frames),
                                  sampleBuffer.forget(),
                                  mChannels));
 
@@ -416,17 +416,17 @@ nsWaveReader::LoadFormatChunk()
     uint16_t extra = ReadUint16LE(&p);
     if (fmtSize - (WAVE_FORMAT_CHUNK_SIZE + 2) != extra) {
       NS_WARNING("Invalid extended format chunk size");
       return false;
     }
     extra += extra % 2;
 
     if (extra > 0) {
-      PR_STATIC_ASSERT(PR_UINT16_MAX + (PR_UINT16_MAX % 2) < UINT_MAX / sizeof(char));
+      PR_STATIC_ASSERT(UINT16_MAX + (UINT16_MAX % 2) < UINT_MAX / sizeof(char));
       nsAutoArrayPtr<char> chunkExtension(new char[extra]);
       if (!ReadAll(chunkExtension.get(), extra)) {
         return false;
       }
     }
   }
 
   // RIFF chunks are always word (two byte) aligned.
@@ -468,17 +468,17 @@ nsWaveReader::FindDataOffset()
   // The "data" chunk may not directly follow the "format" chunk, so skip
   // over any intermediate chunks.
   uint32_t length;
   if (!ScanForwardUntil(DATA_CHUNK_MAGIC, &length)) {
     return false;
   }
 
   int64_t offset = mDecoder->GetResource()->Tell();
-  if (offset <= 0 || offset > PR_UINT32_MAX) {
+  if (offset <= 0 || offset > UINT32_MAX) {
     NS_WARNING("PCM data offset out of range");
     return false;
   }
 
   ReentrantMonitorAutoEnter monitor(mDecoder->GetReentrantMonitor());
   mWaveLength = length;
   mWavePCMOffset = uint32_t(offset);
   return true;
--- a/content/smil/nsSMILInstanceTime.cpp
+++ b/content/smil/nsSMILInstanceTime.cpp
@@ -133,17 +133,17 @@ void
 nsSMILInstanceTime::UnmarkShouldPreserve()
 {
   mFlags &= ~kWasDynamicEndpoint;
 }
 
 void
 nsSMILInstanceTime::AddRefFixedEndpoint()
 {
-  NS_ABORT_IF_FALSE(mFixedEndpointRefCnt < PR_UINT16_MAX,
+  NS_ABORT_IF_FALSE(mFixedEndpointRefCnt < UINT16_MAX,
       "Fixed endpoint reference count upper limit reached");
   ++mFixedEndpointRefCnt;
   mFlags &= ~kMayUpdate; // Once fixed, always fixed
 }
 
 void
 nsSMILInstanceTime::ReleaseFixedEndpoint()
 {
--- a/content/svg/content/src/nsSVGFilters.cpp
+++ b/content/svg/content/src/nsSVGFilters.cpp
@@ -481,17 +481,17 @@ nsSVGFEGaussianBlurElement::SetStdDeviat
  * 66052
  * 
  * So this is fine for all reasonable values of N. For larger values of N
  * we may as well just use the same approximation and accept the fact that
  * the output channel values will be a little low.
  */
 static uint32_t ComputeScaledDivisor(uint32_t aDivisor)
 {
-  return PR_UINT32_MAX/(255*aDivisor);
+  return UINT32_MAX/(255*aDivisor);
 }
   
 static void
 BoxBlur(const uint8_t *aInput, uint8_t *aOutput,
         int32_t aStrideMinor, int32_t aStartMinor, int32_t aEndMinor,
         int32_t aLeftLobe, int32_t aRightLobe, bool aAlphaOnly)
 {
   int32_t boxSize = aLeftLobe + aRightLobe + 1;
--- a/content/svg/content/src/nsSVGFilters.h
+++ b/content/svg/content/src/nsSVGFilters.h
@@ -177,17 +177,17 @@ public:
   // returns true if changes to the attribute should cause us to
   // repaint the filter
   virtual bool AttributeAffectsRendering(
           int32_t aNameSpaceID, nsIAtom* aAttribute) const;
 
   static nsIntRect GetMaxRect() {
     // Try to avoid overflow errors dealing with this rect. It will
     // be intersected with some other reasonable-sized rect eventually.
-    return nsIntRect(PR_INT32_MIN/2, PR_INT32_MIN/2, PR_INT32_MAX, PR_INT32_MAX);
+    return nsIntRect(INT32_MIN/2, INT32_MIN/2, INT32_MAX, INT32_MAX);
   }
 
   operator nsISupports*() { return static_cast<nsIContent*>(this); }
   
 protected:
   virtual bool OperatesOnPremultipledAlpha(int32_t) { return true; }
 
   // Called either with aInputIndex >=0 in which case this is
--- a/content/svg/content/test/Makefile.in
+++ b/content/svg/content/test/Makefile.in
@@ -67,20 +67,25 @@ MOCHITEST_FILES = \
 		test_SVGStyleElement.xhtml \
 		test_SVGStringList.xhtml \
 		test_SVGTransformList.xhtml \
 		test_SVGTransformListAddition.xhtml \
 		test_SVGxxxList.xhtml \
 		test_SVGxxxListIndexing.xhtml \
 		test_switch.xhtml \
 		switch-helper.svg \
-		test_text.html \
 		text-helper.svg \
 		test_transform.xhtml \
 		test_valueAsString.xhtml \
 		test_valueLeaks.xhtml \
 		viewport-helper.svg \
 		test_viewport.html \
 		zoom-helper.svg \
 		test_zoom.xhtml \
 		$(NULL)
 
+ifneq (android,$(MOZ_WIDGET_TOOLKIT))
+MOCHITEST_FILES += \
+		test_text.html \
+		$(NULL)
+endif
+
 include $(topsrcdir)/config/rules.mk
--- a/content/xslt/src/xslt/txNodeSorter.cpp
+++ b/content/xslt/src/xslt/txNodeSorter.cpp
@@ -142,18 +142,18 @@ txNodeSorter::sortNodeSet(txNodeSet* aNo
     rv = aEs->pushEvalContext(evalContext);
     NS_ENSURE_SUCCESS(rv, rv);
 
     // Create and set up memoryblock for sort-values and indexarray
     uint32_t len = static_cast<uint32_t>(aNodes->size());
 
     // Limit resource use to something sane.
     uint32_t itemSize = sizeof(uint32_t) + mNKeys * sizeof(txObject*);
-    if (mNKeys > (PR_UINT32_MAX - sizeof(uint32_t)) / sizeof(txObject*) ||
-        len >= PR_UINT32_MAX / itemSize) {
+    if (mNKeys > (UINT32_MAX - sizeof(uint32_t)) / sizeof(txObject*) ||
+        len >= UINT32_MAX / itemSize) {
         return NS_ERROR_OUT_OF_MEMORY;
     }
 
     void* mem = PR_Malloc(len * itemSize);
     NS_ENSURE_TRUE(mem, NS_ERROR_OUT_OF_MEMORY);
 
     uint32_t* indexes = static_cast<uint32_t*>(mem);
     txObject** sortValues = reinterpret_cast<txObject**>(indexes + len);
--- a/content/xul/document/src/nsXULPrototypeCache.cpp
+++ b/content/xul/document/src/nsXULPrototypeCache.cpp
@@ -646,17 +646,17 @@ nsXULPrototypeCache::BeginCaching(nsIURI
               rv = tmp;
             }
         }
 
         if (NS_SUCCEEDED(rv)) {
             uint64_t len64;
             rv = inputStream->Available(&len64);
             if (NS_SUCCEEDED(rv)) {
-              if (len64 <= PR_UINT32_MAX)
+              if (len64 <= UINT32_MAX)
                 len = (uint32_t)len64;
               else
                 rv = NS_ERROR_FILE_TOO_BIG;
             }
         }
         
         if (NS_SUCCEEDED(rv)) {
             buf = new char[len];
--- a/content/xul/document/src/nsXULPrototypeDocument.cpp
+++ b/content/xul/document/src/nsXULPrototypeDocument.cpp
@@ -316,21 +316,21 @@ nsXULPrototypeDocument::Read(nsIObjectIn
             prefix = do_GetAtom(prefixStr);
         }
         tmp = aStream->ReadString(localName);
         if (NS_FAILED(tmp)) {
           rv = tmp;
         }
 
         nsCOMPtr<nsINodeInfo> nodeInfo;
-        // Using PR_UINT16_MAX here as we don't know which nodeinfos will be
+        // Using UINT16_MAX here as we don't know which nodeinfos will be
         // used for attributes and which for elements. And that doesn't really
         // matter.
         tmp = mNodeInfoManager->GetNodeInfo(localName, prefix, namespaceURI,
-                                            PR_UINT16_MAX,
+                                            UINT16_MAX,
                                             getter_AddRefs(nodeInfo));
         if (NS_FAILED(tmp)) {
           rv = tmp;
         }
         if (!nodeInfos.AppendObject(nodeInfo))
           rv = NS_ERROR_OUT_OF_MEMORY;
     }
 
--- a/content/xul/templates/src/nsTemplateRule.h
+++ b/content/xul/templates/src/nsTemplateRule.h
@@ -289,17 +289,17 @@ public:
     void SetTag(nsIAtom* aTag) { mTag = aTag; }
 
     nsTemplateRule* NewRule(nsIContent* aRuleNode,
                             nsIContent* aAction,
                             nsTemplateQuerySet* aQuerySet)
     {
         // nsTemplateMatch stores the index as a 16-bit value,
         // so check to make sure for overflow
-        if (mRules.Length() == PR_INT16_MAX)
+        if (mRules.Length() == INT16_MAX)
             return nullptr;
 
         return mRules.AppendElement(nsTemplateRule(aRuleNode, aAction,
                                     aQuerySet));
     }
     
     void RemoveRule(nsTemplateRule *aRule)
     {
--- a/content/xul/templates/src/nsXULTemplateBuilder.cpp
+++ b/content/xul/templates/src/nsXULTemplateBuilder.cpp
@@ -1825,17 +1825,17 @@ nsXULTemplateBuilder::CompileTemplate(ns
 
     for (nsIContent* rulenode = aTemplate->GetFirstChild();
          rulenode;
          rulenode = rulenode->GetNextSibling()) {
 
         nsINodeInfo *ni = rulenode->NodeInfo();
 
         // don't allow more queries than can be supported
-        if (*aPriority == PR_INT16_MAX)
+        if (*aPriority == INT16_MAX)
             return NS_ERROR_FAILURE;
 
         // XXXndeakin queryset isn't a good name for this tag since it only
         //            ever contains one query
         if (!aIsQuerySet && ni->Equals(nsGkAtoms::queryset, kNameSpaceID_XUL)) {
             if (hasRule || hasQuery) {
               nsXULContentUtils::LogTemplateError(ERROR_TEMPLATE_INVALID_QUERYSET);
               continue;
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -9367,17 +9367,17 @@ nsDocShell::AddHeadersToChannel(nsIInput
 {
     nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(aGenericChannel);
     NS_ENSURE_STATE(httpChannel);
 
     uint32_t numRead;
     nsAutoCString headersString;
     nsresult rv = aHeadersData->ReadSegments(AppendSegmentToString,
                                              &headersString,
-                                             PR_UINT32_MAX,
+                                             UINT32_MAX,
                                              &numRead);
     NS_ENSURE_SUCCESS(rv, rv);
 
     // used during the manipulation of the String from the InputStream
     nsAutoCString headerName;
     nsAutoCString headerValue;
     int32_t crlf;
     int32_t colon;
--- a/docshell/test/navigation/Makefile.in
+++ b/docshell/test/navigation/Makefile.in
@@ -9,17 +9,16 @@ VPATH		= @srcdir@
 relativesrcdir  = @relativesrcdir@
 
 MODULE = test_docshell
 
 include $(DEPTH)/config/autoconf.mk
 
 MOCHITEST_FILES = \
 		test_bug13871.html \
-		test_bug270414.html \
 		test_bug278916.html \
 		test_bug279495.html \
 		test_bug386782.html \
 		test_bug430624.html \
 		test_bug430723.html \
 		test_child.html \
 		test_grandchild.html \
 		test_sibling-off-domain.html \
@@ -45,16 +44,19 @@ MOCHITEST_FILES = \
 		frame1.html \
 		frame2.html \
 		frame3.html \
 		goback.html \
 		file_bug534178.html \
 		$(NULL)
 
 ifneq (mobile,$(MOZ_BUILD_APP))
+MOCHITEST_FILES += \
+		test_bug270414.html \
+		$(NULL)
 MOCHITEST_BROWSER_FILES = \
 		browser_bug343515.js \
 		bug343515_pg1.html \
 		bug343515_pg2.html \
 		bug343515_pg3.html \
 		bug343515_pg3_1.html \
 		bug343515_pg3_2.html \
 		bug343515_pg3_1_1.html \
--- a/dom/Makefile.in
+++ b/dom/Makefile.in
@@ -47,16 +47,17 @@ PARALLEL_DIRS += \
   activities \
   bindings \
   battery \
   bluetooth \
   browser-element \
   contacts \
   alarm \
   devicestorage \
+  encoding \
   file \
   media \
   messages \
   power \
   settings \
   sms \
   mms \
   src \
--- a/dom/base/domerr.msg
+++ b/dom/base/domerr.msg
@@ -30,16 +30,21 @@ DOM4_MSG_DEF(QuotaExceededError, "The qu
 DOM4_MSG_DEF(TimeoutError, "The operation timed out.", NS_ERROR_DOM_TIMEOUT_ERR)
 DOM4_MSG_DEF(InvalidNodeTypeError, "The supplied node is incorrect or has an incorrect ancestor for this operation.", NS_ERROR_DOM_INVALID_NODE_TYPE_ERR)
 DOM4_MSG_DEF(DataCloneError, "The object could not be cloned.", NS_ERROR_DOM_DATA_CLONE_ERR)
 
 /* XXX Should be JavaScript native TypeError */
 DOM4_MSG_DEF(TypeError, "The method parameter is missing or invalid.", NS_ERROR_TYPE_ERR)
 DOM4_MSG_DEF(RangeError, "The method parameter is out of valid range.", NS_ERROR_RANGE_ERR)
 
+/* StringEncoding API errors from http://wiki.whatwg.org/wiki/StringEncoding */
+DOM4_MSG_DEF(EncodingError, "The given encoding is not supported.", NS_ERROR_DOM_ENCODING_NOT_SUPPORTED_ERR)
+DOM4_MSG_DEF(EncodingError, "The encoding must be utf-8, utf-16, or utf-16be.", NS_ERROR_DOM_ENCODING_NOT_UTF_ERR)
+DOM4_MSG_DEF(EncodingError, "The decoder failed to convert.", NS_ERROR_DOM_ENCODING_DECODE_ERR)
+
 /* SVG DOM errors from http://www.w3.org/TR/SVG11/svgdom.html */
 
 DOM4_MSG_DEF(TypeError, "Unknown or invalid type", NS_ERROR_DOM_SVG_WRONG_TYPE_ERR)
 DOM4_MSG_DEF(InvalidStateError, "The matrix could not be computed", NS_ERROR_DOM_SVG_MATRIX_NOT_INVERTABLE)
 
 /* XPath errors from http://www.w3.org/TR/DOM-Level-3-XPath/ */
 
 DOM4_MSG_DEF(SyntaxError, "The expression is not a legal expression.", NS_ERROR_DOM_INVALID_EXPRESSION_ERR)
--- a/dom/base/nsDOMClassInfo.cpp
+++ b/dom/base/nsDOMClassInfo.cpp
@@ -4345,16 +4345,17 @@ nsDOMClassInfo::Init()
 
   DOM_CLASSINFO_MAP_BEGIN_NO_CLASS_IF(ChromeMessageBroadcaster, nsISupports)
     DOM_CLASSINFO_MAP_ENTRY(nsIFrameScriptLoader)
     DOM_CLASSINFO_MAP_ENTRY(nsIMessageListenerManager)
     DOM_CLASSINFO_MAP_ENTRY(nsIMessageBroadcaster)
   DOM_CLASSINFO_MAP_END
 
   DOM_CLASSINFO_MAP_BEGIN_NO_CLASS_IF(ChromeMessageSender, nsISupports)
+    DOM_CLASSINFO_MAP_ENTRY(nsIPermissionChecker)
     DOM_CLASSINFO_MAP_ENTRY(nsIFrameScriptLoader)
     DOM_CLASSINFO_MAP_ENTRY(nsIMessageListenerManager)
     DOM_CLASSINFO_MAP_ENTRY(nsIMessageSender)
   DOM_CLASSINFO_MAP_END
 
   DOM_CLASSINFO_MAP_BEGIN(FormData, nsIDOMFormData)
     DOM_CLASSINFO_MAP_ENTRY(nsIDOMFormData)
   DOM_CLASSINFO_MAP_END
@@ -9201,17 +9202,17 @@ FlagsToPrivate(uint32_t flags)
   MOZ_ASSERT((flags & (1 << 31)) == 0);
   return reinterpret_cast<void*>(static_cast<uintptr_t>(flags << 1));
 }
 
 static inline uint32_t
 PrivateToFlags(void *priv)
 {
   uintptr_t intPriv = reinterpret_cast<uintptr_t>(priv);
-  MOZ_ASSERT(intPriv <= PR_UINT32_MAX && (intPriv & 1) == 0);
+  MOZ_ASSERT(intPriv <= UINT32_MAX && (intPriv & 1) == 0);
   return static_cast<uint32_t>(intPriv >> 1);
 }
 
 JSBool
 nsHTMLDocumentSH::DocumentAllHelperGetProperty(JSContext *cx, JSHandleObject obj,
                                                JSHandleId id, JSMutableHandleValue vp)
 {
   if (nsDOMClassInfo::sAll_id != id) {
--- a/dom/base/nsDOMException.cpp
+++ b/dom/base/nsDOMException.cpp
@@ -34,16 +34,17 @@ enum DOM4ErrorTypeCodeMap {
   SecurityError              = nsIDOMDOMException::SECURITY_ERR,
   NetworkError               = nsIDOMDOMException::NETWORK_ERR,
   AbortError                 = nsIDOMDOMException::ABORT_ERR,
   URLMismatchError           = nsIDOMDOMException::URL_MISMATCH_ERR,
   QuotaExceededError         = nsIDOMDOMException::QUOTA_EXCEEDED_ERR,
   TimeoutError               = nsIDOMDOMException::TIMEOUT_ERR,
   InvalidNodeTypeError       = nsIDOMDOMException::INVALID_NODE_TYPE_ERR,
   DataCloneError             = nsIDOMDOMException::DATA_CLONE_ERR,
+  EncodingError              = 0,
 
   /* XXX Should be JavaScript native errors */
   TypeError                  = 0,
   RangeError                 = 0,
 
   /* IndexedDB errors http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#exceptions */
   UnknownError             = 0,
   ConstraintError          = 0,
--- a/dom/base/nsDOMWindowUtils.cpp
+++ b/dom/base/nsDOMWindowUtils.cpp
@@ -215,22 +215,20 @@ nsDOMWindowUtils::Redraw(uint32_t aCount
 
   if (aCount == 0)
     aCount = 1;
 
   if (nsIPresShell* presShell = GetPresShell()) {
     nsIFrame *rootFrame = presShell->GetRootFrame();
 
     if (rootFrame) {
-      nsRect r(nsPoint(0, 0), rootFrame->GetSize());
-
       PRIntervalTime iStart = PR_IntervalNow();
 
       for (uint32_t i = 0; i < aCount; i++)
-        rootFrame->InvalidateWithFlags(r, nsIFrame::INVALIDATE_IMMEDIATE);
+        rootFrame->InvalidateFrame();
 
 #if defined(MOZ_X11) && defined(MOZ_WIDGET_GTK)
       XSync(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), False);
 #endif
 
       *aDurationOut = PR_IntervalToMilliseconds(PR_IntervalNow() - iStart);
 
       return NS_OK;
@@ -384,24 +382,17 @@ nsDOMWindowUtils::SetDisplayPortForEleme
       // separate notification just for this change.
       nsPresContext* presContext = GetPresContext();
       MaybeReflowForInflationScreenWidthChange(presContext);
     }
   }
 
   nsIFrame* rootFrame = presShell->FrameManager()->GetRootFrame();
   if (rootFrame) {
-    nsIContent* rootContent =
-      rootScrollFrame ? rootScrollFrame->GetContent() : nullptr;
-    nsRect rootDisplayport;
-    bool usingDisplayport = rootContent &&
-      nsLayoutUtils::GetDisplayPort(rootContent, &rootDisplayport);
-    rootFrame->InvalidateWithFlags(
-      usingDisplayport ? rootDisplayport : rootFrame->GetVisualOverflowRect(),
-      nsIFrame::INVALIDATE_NO_THEBES_LAYERS);
+    rootFrame->InvalidateFrame();
 
     // If we are hiding something that is a display root then send empty paint
     // transaction in order to release retained layers because it won't get
     // any more paint requests when it is hidden.
     if (displayport.IsEmpty() &&
         rootFrame == nsLayoutUtils::GetDisplayRootFrame(rootFrame)) {
       nsCOMPtr<nsIWidget> widget = GetWidget();
       if (widget) {
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -230,16 +230,17 @@
 #ifdef PR_LOGGING
 static PRLogModuleInfo* gDOMLeakPRLog;
 #endif
 
 static const char kStorageEnabled[] = "dom.storage.enabled";
 
 using namespace mozilla;
 using namespace mozilla::dom;
+using namespace mozilla::dom::ipc;
 using mozilla::TimeStamp;
 using mozilla::TimeDuration;
 
 nsGlobalWindow::WindowByIdTable *nsGlobalWindow::sWindowsById = nullptr;
 bool nsGlobalWindow::sWarnedAboutWindowInternal = false;
 bool nsGlobalWindow::sIdleObserversAPIFuzzTimeDisabled = false;
 
 static nsIEntropyCollector *gEntropyCollector          = nullptr;
@@ -8763,17 +8764,17 @@ nsGlobalWindow::RegisterIdleObserver(nsI
 
   MOZ_ASSERT(mIdleService);
   MOZ_ASSERT(mIdleTimer);
 
   IdleObserverHolder tmpIdleObserver;
   tmpIdleObserver.mIdleObserver = aIdleObserver;
   rv = aIdleObserver->GetTime(&tmpIdleObserver.mTimeInS);
   NS_ENSURE_SUCCESS(rv, rv);
-  NS_ENSURE_ARG_MAX(tmpIdleObserver.mTimeInS, PR_UINT32_MAX / 1000);
+  NS_ENSURE_ARG_MAX(tmpIdleObserver.mTimeInS, UINT32_MAX / 1000);
   NS_ENSURE_ARG_MIN(tmpIdleObserver.mTimeInS, MIN_IDLE_NOTIFICATION_TIME_S);
 
   uint32_t insertAtIndex = FindInsertionIndex(&tmpIdleObserver);
   if (insertAtIndex == mIdleObservers.Length()) {
     mIdleObservers.AppendElement(tmpIdleObserver);
   }
   else {
     mIdleObservers.InsertElementAt(insertAtIndex, tmpIdleObserver);
@@ -10999,26 +11000,20 @@ nsGlobalChromeWindow::GetMessageManager(
   if (!mMessageManager) {
     nsIScriptContext* scx = GetContextInternal();
     NS_ENSURE_STATE(scx);
     JSContext* cx = scx->GetNativeContext();
     NS_ENSURE_STATE(cx);
     nsCOMPtr<nsIMessageBroadcaster> globalMM =
       do_GetService("@mozilla.org/globalmessagemanager;1");
     mMessageManager =
-      new nsFrameMessageManager(true, /* aChrome */
-                                nullptr,
-                                nullptr,
-                                nullptr,
-                                nullptr,
+      new nsFrameMessageManager(nullptr,
                                 static_cast<nsFrameMessageManager*>(globalMM.get()),
                                 cx,
-                                false, /* aGlobal */
-                                false, /* aProcessManager */
-                                true /* aBroadcaster */);
+                                MM_CHROME | MM_BROADCASTER);
     NS_ENSURE_TRUE(mMessageManager, NS_ERROR_OUT_OF_MEMORY);
   }
   CallQueryInterface(mMessageManager, aManager);
   return NS_OK;
 }
 
 // nsGlobalModalWindow implementation
 
--- a/dom/base/nsJSEnvironment.cpp
+++ b/dom/base/nsJSEnvironment.cpp
@@ -157,24 +157,24 @@ static js::AnalysisPurgeCallback sPrevAn
 static uint32_t sPendingLoadCount;
 static bool sLoadingInProgress;
 
 static uint32_t sCCollectedWaitingForGC;
 static bool sPostGCEventsToConsole;
 static bool sPostGCEventsToObserver;
 static bool sDisableExplicitCompartmentGC;
 static uint32_t sCCTimerFireCount = 0;
-static uint32_t sMinForgetSkippableTime = PR_UINT32_MAX;
+static uint32_t sMinForgetSkippableTime = UINT32_MAX;
 static uint32_t sMaxForgetSkippableTime = 0;
 static uint32_t sTotalForgetSkippableTime = 0;
 static uint32_t sRemovedPurples = 0;
 static uint32_t sForgetSkippableBeforeCC = 0;
 static uint32_t sPreviousSuspectedCount = 0;
 static uint32_t sCompartmentGCCount = NS_MAX_COMPARTMENT_GC_COUNT;
-static uint32_t sCleanupsSinceLastGC = PR_UINT32_MAX;
+static uint32_t sCleanupsSinceLastGC = UINT32_MAX;
 static bool sNeedsFullCC = false;
 static nsJSContext *sContextList = nullptr;
 
 nsScriptNameSpaceManager *gNameSpaceManager;
 
 static nsIJSRuntimeService *sRuntimeService;
 JSRuntime *nsJSRuntime::sRuntime;
 
@@ -3090,17 +3090,17 @@ nsJSContext::CycleCollectNow(nsICycleCol
   sLastCCEndTime = now;
 
   Telemetry::Accumulate(Telemetry::FORGET_SKIPPABLE_MAX,
                         sMaxForgetSkippableTime / PR_USEC_PER_MSEC);
 
   PRTime delta = GetCollectionTimeDelta();
 
   uint32_t cleanups = sForgetSkippableBeforeCC ? sForgetSkippableBeforeCC : 1;
-  uint32_t minForgetSkippableTime = (sMinForgetSkippableTime == PR_UINT32_MAX)
+  uint32_t minForgetSkippableTime = (sMinForgetSkippableTime == UINT32_MAX)
     ? 0 : sMinForgetSkippableTime;
 
   if (sPostGCEventsToConsole) {
     nsCString mergeMsg;
     if (mergingCC) {
       mergeMsg.AssignLiteral(" merged");
     }
 
@@ -3167,17 +3167,17 @@ nsJSContext::CycleCollectNow(nsICycleCol
                                            PR_USEC_PER_MSEC,
                                          sTotalForgetSkippableTime / PR_USEC_PER_MSEC,
                                          sRemovedPurples));
     nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService();
     if (observerService) {
       observerService->NotifyObservers(nullptr, "cycle-collection-statistics", json.get());
     }
   }
-  sMinForgetSkippableTime = PR_UINT32_MAX;
+  sMinForgetSkippableTime = UINT32_MAX;
   sMaxForgetSkippableTime = 0;
   sTotalForgetSkippableTime = 0;
   sRemovedPurples = 0;
   sForgetSkippableBeforeCC = 0;
   sNeedsFullCC = false;
 }
 
 // static
@@ -3887,17 +3887,17 @@ ReadSourceFromFilename(JSContext *cx, co
   rv = scriptChannel->Open(getter_AddRefs(scriptStream));
   NS_ENSURE_SUCCESS(rv, rv);
 
   uint64_t rawLen;
   rv = scriptStream->Available(&rawLen);
   NS_ENSURE_SUCCESS(rv, rv);
   if (!rawLen)
     return NS_ERROR_FAILURE;
-  if (rawLen > PR_UINT32_MAX)
+  if (rawLen > UINT32_MAX)
     return NS_ERROR_FILE_TOO_BIG;
 
   // Allocate an internal buf the size of the file.
   nsAutoArrayPtr<unsigned char> buf(new unsigned char[rawLen]);
   if (!buf)
     return NS_ERROR_OUT_OF_MEMORY;
 
   unsigned char *ptr = buf, *end = ptr + rawLen;
--- a/dom/bindings/Bindings.conf
+++ b/dom/bindings/Bindings.conf
@@ -329,16 +329,25 @@ DOMInterfaces = {
 'SVGTransformList': [
 {
     'nativeType': 'mozilla::DOMSVGTransformList',
     'headerFile': 'DOMSVGTransformList.h',
     'prefable': True,
     'resultNotAddRefed': [ 'getItem' ]
 }],
 
+'TextEncoder': {
+    'headerFile': 'mozilla/dom/TextEncoder.h',
+    'implicitJSContext': [ 'encode' ],
+},
+
+'TextDecoder': {
+    'headerFile': 'mozilla/dom/TextDecoder.h',
+},
+
 'WebGLRenderingContext': {
   'nativeType': 'mozilla::WebGLContext',
   'headerFile': 'WebGLContext.h',
   'resultNotAddRefed': [ 'canvas', 'getContextAttributes', 'getExtension',
                          'getAttachedShaders' ],
   'implicitJSContext': [ 'texImage2D', 'texSubImage2D' ],
 },
 
new file mode 100644
--- /dev/null
+++ b/dom/bluetooth/BluetoothOppManager.cpp
@@ -0,0 +1,134 @@
+/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "base/basictypes.h"
+#include "BluetoothOppManager.h"
+
+#include "BluetoothReplyRunnable.h"
+#include "BluetoothService.h"
+#include "BluetoothServiceUuid.h"
+#include "ObexBase.h"
+
+#include "mozilla/dom/ipc/Blob.h"
+#include "mozilla/RefPtr.h"
+
+USING_BLUETOOTH_NAMESPACE
+using namespace mozilla::ipc;
+
+static mozilla::RefPtr<BluetoothOppManager> sInstance;
+
+BluetoothOppManager::BluetoothOppManager() : mConnected(false)
+                                           , mConnectionId(1)
+                                           , mLastCommand(0)
+{
+}
+
+BluetoothOppManager::~BluetoothOppManager()
+{
+}
+
+//static
+BluetoothOppManager*
+BluetoothOppManager::Get()
+{
+  MOZ_ASSERT(NS_IsMainThread());
+
+  if (sInstance == nullptr) {
+    sInstance = new BluetoothOppManager();
+  }
+
+  return sInstance;
+}
+
+bool
+BluetoothOppManager::Connect(const nsAString& aDeviceObjectPath,
+                             BluetoothReplyRunnable* aRunnable)
+{
+  MOZ_ASSERT(NS_IsMainThread());
+
+  BluetoothService* bs = BluetoothService::Get();
+  if (!bs) {
+    NS_WARNING("BluetoothService not available!");
+    return false;
+  }
+
+  nsString serviceUuidStr =
+    NS_ConvertUTF8toUTF16(mozilla::dom::bluetooth::BluetoothServiceUuidStr::ObjectPush);
+
+  nsRefPtr<BluetoothReplyRunnable> runnable = aRunnable;
+
+  nsresult rv = bs->GetSocketViaService(aDeviceObjectPath,
+                                        serviceUuidStr,
+                                        BluetoothSocketType::RFCOMM,
+                                        true,
+                                        false,
+                                        this,
+                                        runnable);
+
+  runnable.forget();
+  return NS_FAILED(rv) ? false : true;
+}
+
+void
+BluetoothOppManager::Disconnect()
+{
+  CloseSocket();
+}
+
+bool
+BluetoothOppManager::SendFile(BlobParent* aParent,
+                              BluetoothReplyRunnable* aRunnable)
+{
+  // will implement in another patch.
+  return true;
+}
+
+bool
+BluetoothOppManager::StopSendingFile(BluetoothReplyRunnable* aRunnable)
+{
+  // will implement in another patch.
+  return true;
+}
+
+// Virtual function of class SocketConsumer
+void
+BluetoothOppManager::ReceiveSocketData(UnixSocketRawData* aMessage)
+{
+  uint8_t responseCode = aMessage->mData[0];
+
+  if (mLastCommand == ObexRequestCode::Connect) {
+    if (responseCode == ObexResponseCode::Success) {
+      mConnected = true;
+    }
+  } else if (mLastCommand == ObexRequestCode::Disconnect) {
+    if (responseCode == ObexResponseCode::Success) {
+      mConnected = false;
+    }
+  }
+}
+
+void
+BluetoothOppManager::SendConnectReqeust()
+{
+  // Section 3.3.1 "Connect", IrOBEX 1.2
+  // [opcode:1][length:2][version:1][flags:1][MaxPktSizeWeCanReceive:2][Headers:var]
+  uint8_t req[255];
+  int index = 7;
+
+  req[3] = 0x10; // version=1.0
+  req[4] = 0x00; // flag=0x00
+  req[5] = BluetoothOppManager::MAX_PACKET_LENGTH >> 8;
+  req[6] = BluetoothOppManager::MAX_PACKET_LENGTH;
+
+  index += AppendHeaderConnectionId(&req[index], mConnectionId++);
+  SetObexPacketInfo(req, ObexRequestCode::Connect, index);
+  mLastCommand = ObexRequestCode::Connect;
+
+  UnixSocketRawData* s = new UnixSocketRawData(index);
+  memcpy(s->mData, req, s->mSize);
+  SendSocketData(s);
+}
+
new file mode 100644
--- /dev/null
+++ b/dom/bluetooth/BluetoothOppManager.h
@@ -0,0 +1,64 @@
+/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_bluetooth_bluetoothoppmanager_h__
+#define mozilla_dom_bluetooth_bluetoothoppmanager_h__
+
+#include "BluetoothCommon.h"
+#include "mozilla/ipc/UnixSocket.h"
+
+BEGIN_BLUETOOTH_NAMESPACE
+
+class BluetoothReplyRunnable;
+class BlobParent;
+
+class BluetoothOppManager : public mozilla::ipc::UnixSocketConsumer
+{
+public:
+  /*
+   * Channel of reserved services are fixed values, please check
+   * function add_reserved_service_records() in
+   * external/bluetooth/bluez/src/adapter.c for more information.
+   */
+  static const int DEFAULT_OPP_CHANNEL = 10;
+  static const int MAX_PACKET_LENGTH = 0xFFFE;
+
+  ~BluetoothOppManager();
+  static BluetoothOppManager* Get();
+  void ReceiveSocketData(mozilla::ipc::UnixSocketRawData* aMessage);
+
+  /*
+   * If a application wnats to send a file, first, it needs to
+   * call Connect() to create a valid RFCOMM connection. After
+   * that, call SendFile()/StopSendingFile() to control file-sharing
+   * process. During the file transfering process, the application
+   * will receive several system messages which contain the processed
+   * percentage of file. At the end, the application will get another
+   * system message indicating that te process is complete, then it can
+   * either call Disconnect() to close RFCOMM connection or start another
+   * file-sending thread via calling SendFile() again.
+   */
+  bool Connect(const nsAString& aDeviceObjectPath,
+               BluetoothReplyRunnable* aRunnable);
+  void Disconnect();
+
+  bool SendFile(BlobParent* aBlob,
+                BluetoothReplyRunnable* aRunnable);
+
+  bool StopSendingFile(BluetoothReplyRunnable* aRunnable);
+
+private:
+  BluetoothOppManager();
+  void SendConnectReqeust();
+
+  bool mConnected;
+  int mConnectionId;
+  int mLastCommand;
+};
+
+END_BLUETOOTH_NAMESPACE
+
+#endif
--- a/dom/bluetooth/BluetoothServiceUuid.h
+++ b/dom/bluetooth/BluetoothServiceUuid.h
@@ -7,36 +7,32 @@
 #ifndef mozilla_dom_bluetooth_bluetoothuuid_h__
 #define mozilla_dom_bluetooth_bluetoothuuid_h__
 
 namespace mozilla {
 namespace dom {
 namespace bluetooth {
 
 namespace BluetoothServiceUuid {
-  static unsigned long long AudioSink    = 0x0000110B00000000;
-  static unsigned long long AudioSource  = 0x0000110A00000000;
-  static unsigned long long AdvAudioDist = 0x0000110D00000000;
   static unsigned long long Headset      = 0x0000110800000000;
   static unsigned long long HeadsetAG    = 0x0000111200000000;
   static unsigned long long Handsfree    = 0x0000111E00000000;
   static unsigned long long HandsfreeAG  = 0x0000111F00000000;
+  static unsigned long long ObjectPush   = 0x0000110500000000;
 
   static unsigned long long BaseMSB     = 0x0000000000001000;
   static unsigned long long BaseLSB     = 0x800000805F9B34FB;
 }
 
 namespace BluetoothServiceUuidStr {
-  static const char* AudioSink     = "0000110B-0000-1000-8000-00805F9B34FB";
-  static const char* AudioSource   = "0000110A-0000-1000-8000-00805F9B34FB";
-  static const char* AdvAudioDist  = "0000110D-0000-1000-8000-00805F9B34FB";
   static const char* Headset       = "00001108-0000-1000-8000-00805F9B34FB";
   static const char* HeadsetAG     = "00001112-0000-1000-8000-00805F9B34FB";
   static const char* Handsfree     = "0000111E-0000-1000-8000-00805F9B34FB";
   static const char* HandsfreeAG   = "0000111F-0000-1000-8000-00805F9B34FB";
+  static const char* ObjectPush    = "00001105-0000-1000-8000-00805F9B34FB";
 }
 
 }
 }
 }
 
 #endif
 
--- a/dom/bluetooth/Makefile.in
+++ b/dom/bluetooth/Makefile.in
@@ -48,16 +48,18 @@ CPPSRCS += \
   BluetoothReplyRunnable.cpp \
   BluetoothPropertyContainer.cpp \
   BluetoothUtils.cpp \
   BluetoothChild.cpp \
   BluetoothParent.cpp \
   BluetoothServiceChildProcess.cpp \
   BluetoothUnixSocketConnector.cpp \
   BluetoothHfpManager.cpp \
+  BluetoothOppManager.cpp \
+  ObexBase.cpp \
   $(NULL)
 
 ifdef MOZ_B2G_RIL
 CPPSRCS += BluetoothRilListener.cpp
 endif
 
 XPIDLSRCS = \
   nsIDOMNavigatorBluetooth.idl \
new file mode 100644
--- /dev/null
+++ b/dom/bluetooth/ObexBase.cpp
@@ -0,0 +1,113 @@
+/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "ObexBase.h"
+
+BEGIN_BLUETOOTH_NAMESPACE
+
+int
+AppendHeaderName(uint8_t* retBuf, const char* name, int length)
+{
+  int headerLength = length + 3;
+
+  retBuf[0] = ObexHeaderId::Name;
+  retBuf[1] = (headerLength & 0xFF00) >> 8;
+  retBuf[2] = headerLength & 0x00FF;
+
+  memcpy(&retBuf[3], name, length);
+
+  return headerLength;
+}
+
+int
+AppendHeaderBody(uint8_t* retBuf, uint8_t* data, int length)
+{
+  int headerLength = length + 3;
+
+  retBuf[0] = ObexHeaderId::Body;
+  retBuf[1] = (headerLength & 0xFF00) >> 8;
+  retBuf[2] = headerLength & 0x00FF;
+
+  memcpy(&retBuf[3], data, length);
+
+  return headerLength;
+}
+
+int
+AppendHeaderLength(uint8_t* retBuf, int objectLength)
+{
+  retBuf[0] = ObexHeaderId::Length;
+  retBuf[1] = (objectLength & 0xFF000000) >> 24;
+  retBuf[2] = (objectLength & 0x00FF0000) >> 16;
+  retBuf[3] = (objectLength & 0x0000FF00) >> 8;
+  retBuf[4] = objectLength & 0x000000FF;
+
+  return 5;
+}
+
+int
+AppendHeaderConnectionId(uint8_t* retBuf, int connectionId)
+{
+  retBuf[0] = ObexHeaderId::ConnectionId;
+  retBuf[1] = (connectionId & 0xFF000000) >> 24;
+  retBuf[2] = (connectionId & 0x00FF0000) >> 16;
+  retBuf[3] = (connectionId & 0x0000FF00) >> 8;
+  retBuf[4] = connectionId & 0x000000FF;
+
+  return 5;
+}
+
+void
+SetObexPacketInfo(uint8_t* retBuf, uint8_t opcode, int packetLength)
+{
+  retBuf[0] = opcode;
+  retBuf[1] = (packetLength & 0xFF00) >> 8;
+  retBuf[2] = packetLength & 0x00FF;
+}
+
+void
+ParseHeaders(uint8_t* buf, int totalLength, ObexHeaderSet* retHandlerSet)
+{
+  uint8_t* ptr = buf;
+
+  while (ptr - buf < totalLength) {
+    ObexHeaderId headerId = (ObexHeaderId)*ptr++;
+    int headerLength = 0;
+    uint8_t highByte, lowByte;
+
+    // Defined in 2.1 OBEX Headers, IrOBEX 1.2
+    switch (headerId >> 6)
+    {
+      case 0x00:
+        // NULL terminated Unicode text, length prefixed with 2 byte unsigned integer.
+      case 0x01:
+        // byte sequence, length prefixed with 2 byte unsigned integer.
+        highByte = *ptr++;
+        lowByte = *ptr++;
+        headerLength = ((int)highByte << 8) | lowByte;
+        break;
+
+      case 0x02:
+        // 1 byte quantity
+        headerLength = 1;
+        break;
+
+      case 0x03:
+        // 4 byte quantity
+        headerLength = 4;
+        break;
+    }
+
+    // Content
+    uint8_t* headerContent = new uint8_t[headerLength];
+    memcpy(headerContent, ptr, headerLength);
+    retHandlerSet->AddHeader(new ObexHeader(headerId, headerLength, headerContent));
+
+    ptr += headerLength;
+  }
+}
+
+END_BLUETOOTH_NAMESPACE
new file mode 100644
--- /dev/null
+++ b/dom/bluetooth/ObexBase.h
@@ -0,0 +1,153 @@
+/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_bluetooth_obexbase_h__
+#define mozilla_dom_bluetooth_obexbase_h__
+
+#include "BluetoothCommon.h"
+#include "nsAutoPtr.h"
+#include "nsTArray.h"
+
+BEGIN_BLUETOOTH_NAMESPACE
+
+const char FINAL_BIT = 0x80;
+
+/*
+ * Defined in section 2.1 "OBEX Headers", IrOBEX ver 1.2
+ */
+enum ObexHeaderId {
+  Count = 0xC0,
+  Name = 0x01,
+  Type = 0x42,
+  Length = 0xC3,
+  TimeISO8601 = 0x44,
+  Time4Byte = 0xC4,
+  Description = 0x05,
+  Target = 0x46,
+  HTTP = 0x47,
+  Body = 0x48,
+  EndOfBody = 0x49,
+  Who = 0x4A,
+  ConnectionId = 0xCB,
+  AppParameters = 0x4C,
+  AuthChallenge =0x4D,
+  AuthResponse = 0x4E,
+  ObjectClass = 0x4F
+};
+
+/*
+ * Defined in section 3.3 "OBEX Operations and Opcode definitions",
+ * IrOBEX ver 1.2
+ */
+enum ObexRequestCode {
+  Connect = 0x80,
+  Disconnect = 0x81,
+  Put = 0x02,
+  PutFinal = 0x82,
+  Get = 0x03,
+  GetFinal = 0x83,
+  SetPath = 0x85,
+  Abort = 0xFF
+};
+
+/*
+ * Defined in section 3.2.1 "Response Code values", IrOBEX ver 1.2
+ */
+enum ObexResponseCode {
+  Continue = 0x90,
+
+  Success = 0xA0,
+  Created = 0xA1,
+  Accepted = 0xA2,
+  NonAuthoritativeInfo = 0xA3,
+  NoContent = 0xA4,
+  ResetContent = 0xA5,
+  PartialContent = 0xA6,
+
+  MultipleChoices = 0xB0,
+  MovedPermanently = 0xB1,
+  MovedTemporarily = 0xB2,
+  SeeOther = 0xB3,
+  NotModified = 0xB4,
+  UseProxy = 0xB5,
+
+  BadRequest = 0xC0,
+  Unauthorized = 0xC1,
+  PaymentRequired = 0xC2,
+  Forbidden = 0xC3,
+  NotFound = 0xC4,
+  MethodNotAllowed = 0xC5,
+  NotAcceptable = 0xC6,
+  ProxyAuthenticationRequired = 0xC7,
+  RequestTimeOut = 0xC8,
+  Conflict = 0xC9,
+  Gone = 0xCA,
+  LengthRequired = 0xCB,
+  PreconditionFailed = 0xCC,
+  RequestedEntityTooLarge = 0xCD,
+  RequestUrlTooLarge = 0xCE,
+  UnsupprotedMediaType = 0xCF,
+
+  InternalServerError = 0xD0,
+  NotImplemented = 0xD1,
+  BadGateway = 0xD2,
+  ServiceUnavailable = 0xD3,
+  GatewayTimeout = 0xD4,
+  HttpVersionNotSupported = 0xD5,
+
+  DatabaseFull = 0xE0,
+  DatabaseLocked = 0xE1,
+};
+
+class ObexHeader {
+public:
+  ObexHeader(ObexHeaderId aId, int aDataLength, uint8_t* aData)
+    : mId(aId)
+    , mDataLength(aDataLength)
+    , mData(nullptr)
+  {
+    mData = new uint8_t[mDataLength];
+    memcpy(mData, aData, aDataLength);
+  }
+
+  ~ObexHeader()
+  {
+  }
+
+  ObexHeaderId mId;
+  int mDataLength;
+  nsAutoPtr<uint8_t> mData;
+};
+
+class ObexHeaderSet {
+public:
+  uint8_t mOpcode;
+  nsTArray<nsAutoPtr<ObexHeader> > mHeaders;
+
+  ObexHeaderSet(uint8_t aOpcode) : mOpcode(aOpcode)
+  {
+  }
+
+  ~ObexHeaderSet()
+  {
+  }
+
+  void AddHeader(ObexHeader* aHeader)
+  {
+    mHeaders.AppendElement(aHeader);
+  }
+};
+
+int AppendHeaderName(uint8_t* retBuf, const char* name, int length);
+int AppendHeaderBody(uint8_t* retBuf, uint8_t* data, int length);
+int AppendHeaderLength(uint8_t* retBuf, int objectLength);
+int AppendHeaderConnectionId(uint8_t* retBuf, int connectionId);
+void SetObexPacketInfo(uint8_t* retBuf, uint8_t opcode, int packetLength);
+void ParseHeaders(uint8_t* buf, int totalLength, ObexHeaderSet* retHanderSet);
+
+END_BLUETOOTH_NAMESPACE
+
+#endif
--- a/dom/camera/GonkCameraControl.cpp
+++ b/dom/camera/GonkCameraControl.cpp
@@ -752,17 +752,17 @@ nsGonkCameraControl::TakePictureComplete
 }
 
 void
 nsGonkCameraControl::SetPreviewSize(uint32_t aWidth, uint32_t aHeight)
 {
   Vector<Size> previewSizes;
   uint32_t bestWidth = aWidth;
   uint32_t bestHeight = aHeight;
-  uint32_t minSizeDelta = PR_UINT32_MAX;
+  uint32_t minSizeDelta = UINT32_MAX;
   uint32_t delta;
   Size size;
 
   mParams.getSupportedPreviewSizes(previewSizes);
 
   if (!aWidth && !aHeight) {
     // no size specified, take the first supported size
     size = previewSizes[0];
--- a/dom/devicestorage/nsDeviceStorage.cpp
+++ b/dom/devicestorage/nsDeviceStorage.cpp
@@ -362,17 +362,17 @@ DeviceStorageFile::Write(nsIInputStream*
   if (!bufferedOutputStream) {
     return NS_ERROR_FAILURE;
   }
 
   rv = NS_OK;
   while (bufSize) {
     uint32_t wrote;
     rv = bufferedOutputStream->WriteFrom(aInputStream,
-                                         static_cast<uint32_t>(NS_MIN<uint64_t>(bufSize, PR_UINT32_MAX)),
+                                         static_cast<uint32_t>(NS_MIN<uint64_t>(bufSize, UINT32_MAX)),
                                          &wrote);
     if (NS_FAILED(rv)) {
       break;
     }
     bufSize -= wrote;
   }
 
   iocomplete = new IOEventComplete(this, "modified");
--- a/dom/dom-config.mk
+++ b/dom/dom-config.mk
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 DOM_SRCDIRS = \
   dom/base \
   dom/battery \
+  dom/encoding \
   dom/file \
   dom/power \
   dom/media \
   dom/network/src \
   dom/settings \
   dom/sms/src \
   dom/contacts \
   dom/permission \
new file mode 100644
--- /dev/null
+++ b/dom/encoding/EncodingUtils.cpp
@@ -0,0 +1,339 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/EncodingUtils.h"
+#include "nsAutoPtr.h"
+
+namespace mozilla {
+namespace dom {
+
+EncodingUtils* gEncodings = nullptr;
+
+struct LabelEncoding
+{
+  const char* mLabel;
+  const char* mEncoding;
+};
+
+static const LabelEncoding labelsEncodings[] = {
+  {"unicode-1-1-utf-8", "utf-8"},
+  {"utf-8", "utf-8"},
+  {"utf8", "utf-8"},
+  {"cp864", "ibm864"},
+  {"csibm864", "ibm864"},
+  {"ibm-864", "ibm864"},
+  {"ibm864", "ibm864"},
+  {"866", "ibm866"},
+  {"cp866", "ibm866"},
+  {"csibm866", "ibm866"},
+  {"ibm866", "ibm866"},
+  {"csisolatin2", "iso-8859-2"},
+  {"iso-8859-2", "iso-8859-2"},
+  {"iso-ir-101", "iso-8859-2"},
+  {"iso8859-2", "iso-8859-2"},
+  {"iso88592", "iso-8859-2"},
+  {"iso_8859-2", "iso-8859-2"},
+  {"iso_8859-2:1987", "iso-8859-2"},
+  {"l2", "iso-8859-2"},
+  {"latin2", "iso-8859-2"},
+  {"csisolatin3", "iso-8859-3"},
+  {"iso-8859-3", "iso-8859-3"},
+  {"iso-ir-109", "iso-8859-3"},
+  {"iso8859-3", "iso-8859-3"},
+  {"iso88593", "iso-8859-3"},
+  {"iso_8859-3", "iso-8859-3"},
+  {"iso_8859-3:1988", "iso-8859-3"},
+  {"l3", "iso-8859-3"},
+  {"latin3", "iso-8859-3"},
+  {"csisolatin4", "iso-8859-4"},
+  {"iso-8859-4", "iso-8859-4"},
+  {"iso-ir-110", "iso-8859-4"},
+  {"iso8859-4", "iso-8859-4"},
+  {"iso88594", "iso-8859-4"},
+  {"iso_8859-4", "iso-8859-4"},
+  {"iso_8859-4:1988", "iso-8859-4"},
+  {"l4", "iso-8859-4"},
+  {"latin4", "iso-8859-4"},
+  {"csisolatincyrillic", "iso-8859-5"},
+  {"cyrillic", "iso-8859-5"},
+  {"iso-8859-5", "iso-8859-5"},
+  {"iso-ir-144", "iso-8859-5"},
+  {"iso8859-5", "iso-8859-5"},
+  {"iso88595", "iso-8859-5"},
+  {"iso_8859-5", "iso-8859-5"},
+  {"iso_8859-5:1988", "iso-8859-5"},
+  {"arabic", "iso-8859-6"},
+  {"asmo-708", "iso-8859-6"},
+  {"csiso88596e", "iso-8859-6"},
+  {"csiso88596i", "iso-8859-6"},
+  {"csisolatinarabic", "iso-8859-6"},
+  {"ecma-114", "iso-8859-6"},
+  {"iso-8859-6", "iso-8859-6"},
+  {"iso-8859-6-e", "iso-8859-6"},
+  {"iso-8859-6-i", "iso-8859-6"},
+  {"iso-ir-127", "iso-8859-6"},
+  {"iso8859-6", "iso-8859-6"},
+  {"iso88596", "iso-8859-6"},
+  {"iso_8859-6", "iso-8859-6"},
+  {"iso_8859-6:1987", "iso-8859-6"},
+  {"csisolatingreek", "iso-8859-7"},
+  {"ecma-118", "iso-8859-7"},
+  {"elot_928", "iso-8859-7"},
+  {"greek", "iso-8859-7"},
+  {"greek8", "iso-8859-7"},
+  {"iso-8859-7", "iso-8859-7"},
+  {"iso-ir-126", "iso-8859-7"},
+  {"iso8859-7", "iso-8859-7"},
+  {"iso88597", "iso-8859-7"},
+  {"iso_8859-7", "iso-8859-7"},
+  {"iso_8859-7:1987", "iso-8859-7"},
+  {"sun_eu_greek", "iso-8859-7"},
+  {"csiso88598e", "iso-8859-8"},
+  {"csiso88598i", "iso-8859-8"},
+  {"csisolatinhebrew", "iso-8859-8"},
+  {"hebrew", "iso-8859-8"},
+  {"iso-8859-8", "iso-8859-8"},
+  {"iso-8859-8-e", "iso-8859-8"},
+  {"iso-8859-8-i", "iso-8859-8"},
+  {"iso-ir-138", "iso-8859-8"},
+  {"iso8859-8", "iso-8859-8"},
+  {"iso88598", "iso-8859-8"},
+  {"iso_8859-8", "iso-8859-8"},
+  {"iso_8859-8:1988", "iso-8859-8"},
+  {"logical", "iso-8859-8"},
+  {"visual", "iso-8859-8"},
+  {"csisolatin6", "iso-8859-10"},
+  {"iso-8859-10", "iso-8859-10"},
+  {"iso-ir-157", "iso-8859-10"},
+  {"iso8859-10", "iso-8859-10"},
+  {"iso885910", "iso-8859-10"},
+  {"l6", "iso-8859-10"},
+  {"latin6", "iso-8859-10"},
+  {"iso-8859-13", "iso-8859-13"},
+  {"iso8859-13", "iso-8859-13"},
+  {"iso885913", "iso-8859-13"},
+  {"iso-8859-14", "iso-8859-14"},
+  {"iso8859-14", "iso-8859-14"},
+  {"iso885914", "iso-8859-14"},
+  {"csisolatin9", "iso-8859-15"},
+  {"iso-8859-15", "iso-8859-15"},
+  {"iso8859-15", "iso-8859-15"},
+  {"iso885915", "iso-8859-15"},
+  {"iso_8859-15", "iso-8859-15"},
+  {"l9", "iso-8859-15"},
+  {"iso-8859-16", "iso-8859-16"},
+  {"cskoi8r", "koi8-r"},
+  {"koi", "koi8-r"},
+  {"koi8", "koi8-r"},
+  {"koi8-r", "koi8-r"},
+  {"koi8_r", "koi8-r"},
+  {"koi8-u", "koi8-u"},
+  {"csmacintosh", "macintosh"},
+  {"mac", "macintosh"},
+  {"macintosh", "macintosh"},
+  {"x-mac-roman", "macintosh"},
+  {"dos-874", "windows-874"},
+  {"iso-8859-11", "windows-874"},
+  {"iso8859-11", "windows-874"},
+  {"iso885911", "windows-874"},
+  {"tis-620", "windows-874"},
+  {"windows-874", "windows-874"},
+  {"cp1250", "windows-1250"},
+  {"windows-1250", "windows-1250"},
+  {"x-cp1250", "windows-1250"},
+  {"cp1251", "windows-1251"},
+  {"windows-1251", "windows-1251"},
+  {"x-cp1251", "windows-1251"},
+  {"ansi_x3.4-1968", "windows-1252"},
+  {"ascii", "windows-1252"},
+  {"cp1252", "windows-1252"},
+  {"cp819", "windows-1252"},
+  {"csisolatin1", "windows-1252"},
+  {"ibm819", "windows-1252"},
+  {"iso-8859-1", "windows-1252"},
+  {"iso-ir-100", "windows-1252"},
+  {"iso8859-1", "windows-1252"},
+  {"iso88591", "windows-1252"},
+  {"iso_8859-1", "windows-1252"},
+  {"iso_8859-1:1987", "windows-1252"},
+  {"l1", "windows-1252"},
+  {"latin1", "windows-1252"},
+  {"us-ascii", "windows-1252"},
+  {"windows-1252", "windows-1252"},
+  {"x-cp1252", "windows-1252"},
+  {"cp1253", "windows-1253"},
+  {"windows-1253", "windows-1253"},
+  {"x-cp1253", "windows-1253"},
+  {"cp1254", "windows-1254"},
+  {"csisolatin5", "windows-1254"},
+  {"iso-8859-9", "windows-1254"},
+  {"iso-ir-148", "windows-1254"},
+  {"iso8859-9", "windows-1254"},
+  {"iso88599", "windows-1254"},
+  {"iso_8859-9", "windows-1254"},
+  {"iso_8859-9:1989", "windows-1254"},
+  {"l5", "windows-1254"},
+  {"latin5", "windows-1254"},
+  {"windows-1254", "windows-1254"},
+  {"x-cp1254", "windows-1254"},
+  {"cp1255", "windows-1255"},
+  {"windows-1255", "windows-1255"},
+  {"x-cp1255", "windows-1255"},
+  {"cp1256", "windows-1256"},
+  {"windows-1256", "windows-1256"},
+  {"x-cp1256", "windows-1256"},
+  {"cp1257", "windows-1257"},
+  {"windows-1257", "windows-1257"},
+  {"x-cp1257", "windows-1257"},
+  {"cp1258", "windows-1258"},
+  {"windows-1258", "windows-1258"},
+  {"x-cp1258", "windows-1258"},
+  {"x-mac-cyrillic", "x-mac-cyrillic"},
+  {"x-mac-ukrainian", "x-mac-cyrillic"},
+  {"chinese", "gbk"},
+  {"csgb2312", "gbk"},
+  {"csiso58gb231280", "gbk"},
+  {"gb2312", "gbk"},
+  {"gb_2312", "gbk"},
+  {"gb_2312-80", "gbk"},
+  {"gbk", "gbk"},
+  {"iso-ir-58", "gbk"},
+  {"x-gbk", "gbk"},
+  {"gb18030", "gb18030"},
+  {"hz-gb-2312", "hz-gb-2312"},
+  {"big5", "big5"},
+  {"big5-hkscs", "big5"},
+  {"cn-big5", "big5"},
+  {"csbig5", "big5"},
+  {"x-x-big5", "big5"},
+  {"cseucpkdfmtjapanese", "euc-jp"},
+  {"euc-jp", "euc-jp"},
+  {"x-euc-jp", "euc-jp"},
+  {"csiso2022jp", "iso-2022-jp"},
+  {"iso-2022-jp", "iso-2022-jp"},
+  {"csshiftjis", "shift-jis"},
+  {"ms_kanji", "shift-jis"},
+  {"shift-jis", "shift-jis"},
+  {"shift_jis", "shift-jis"},
+  {"sjis", "shift-jis"},
+  {"windows-31j", "shift-jis"},
+  {"x-sjis", "shift-jis"},
+  {"cseuckr", "euc-kr"},
+  {"csksc56011987", "x-windows-949"},
+  {"euc-kr", "x-windows-949"},
+  {"iso-ir-149", "x-windows-949"},
+  {"korean", "x-windows-949"},
+  {"ks_c_5601-1987", "x-windows-949"},
+  {"ks_c_5601-1989", "x-windows-949"},
+  {"ksc5601", "x-windows-949"},
+  {"ksc_5601", "x-windows-949"},
+  {"windows-949", "x-windows-949"},
+  {"csiso2022kr", "iso-2022-kr"},
+  {"iso-2022-kr", "iso-2022-kr"},
+  {"utf-16", "utf-16le"},
+  {"utf-16le", "utf-16le"},
+  {"utf-16be", "utf-16be"}
+};
+
+EncodingUtils::EncodingUtils()
+{
+  MOZ_ASSERT(!gEncodings);
+
+  const uint32_t numLabels = ArrayLength(labelsEncodings);
+  mLabelsEncodings.Init(numLabels);
+
+  for (uint32_t i = 0; i < numLabels; i++) {
+    mLabelsEncodings.Put(NS_ConvertASCIItoUTF16(labelsEncodings[i].mLabel),
+                         labelsEncodings[i].mEncoding);
+  }
+}
+
+EncodingUtils::~EncodingUtils()
+{
+  MOZ_ASSERT(gEncodings && gEncodings == this);
+}
+
+void
+EncodingUtils::Shutdown()
+{
+  NS_IF_RELEASE(gEncodings);
+}
+
+already_AddRefed<EncodingUtils>
+EncodingUtils::GetOrCreate()
+{
+  if (!gEncodings) {
+    gEncodings = new EncodingUtils();
+    NS_ADDREF(gEncodings);
+  }
+  NS_ADDREF(gEncodings);
+  return gEncodings;
+}
+
+uint32_t
+EncodingUtils::IdentifyDataOffset(const char* aData,
+                                  const uint32_t aLength,
+                                  const char*& aRetval)
+{
+  // Truncating to pre-clear return value in case of failure.
+  aRetval = "";
+
+  // Minimum bytes in input stream data that represents
+  // the Byte Order Mark is 2. Max is 3.
+  if (aLength < 2) {
+    return 0;
+  }
+
+  if (aData[0] == '\xFF' && aData[1] == '\xFE') {
+    aRetval = "utf-16le";
+    return 2;
+  }
+
+  if (aData[0] == '\xFE' && aData[1] == '\xFF') {
+    aRetval = "utf-16be";
+    return 2;
+  }
+
+  // Checking utf-8 byte order mark.
+  // Minimum bytes in input stream data that represents
+  // the Byte Order Mark for utf-8 is 3.
+  if (aLength < 3) {
+    return 0;
+  }
+
+  if (aData[0] == '\xEF' && aData[1] == '\xBB' && aData[2] == '\xBF') {
+    aRetval = "utf-8";
+    return 3;
+  }
+  return 0;
+}
+
+bool
+EncodingUtils::FindEncodingForLabel(const nsAString& aLabel,
+                                    const char*& aOutEncoding)
+{
+  nsRefPtr<EncodingUtils> self = EncodingUtils::GetOrCreate();
+  MOZ_ASSERT(self);
+
+  // Save aLabel first because it may be the same as aOutEncoding.
+  nsString label(aLabel);
+  // Truncating to clear aOutEncoding in case of failure.
+  aOutEncoding = EmptyCString().get();
+
+  EncodingUtils::TrimSpaceCharacters(label);
+  if (label.IsEmpty()) {
+    return false;
+  }
+
+  ToLowerCase(label);
+  const char* encoding = self->mLabelsEncodings.Get(label);
+  if (!encoding) {
+    return false;
+  }
+  aOutEncoding = encoding;
+  return true;
+}
+
+} // namespace dom
+} // namespace mozilla
new file mode 100644
--- /dev/null
+++ b/dom/encoding/EncodingUtils.h
@@ -0,0 +1,76 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_encodingutils_h_
+#define mozilla_dom_encodingutils_h_
+
+#include "nsDataHashtable.h"
+#include "nsString.h"
+
+namespace mozilla {
+namespace dom {
+
+class EncodingUtils
+{
+public:
+  NS_INLINE_DECL_REFCOUNTING(EncodingUtils)
+
+  /**
+   * Implements decode algorithm's step 1 & 2 from Encoding spec.
+   * http://dvcs.w3.org/hg/encoding/raw-file/tip/Overview.html#decode
+   *
+   * @param     aData, incoming byte stream of data.
+   * @param     aLength, incoming byte stream length.
+   * @param     aRetval, outgoing encoding corresponding to valid data
+   *            byte order mark.
+   * @return    offset after the BOM bytes in byte stream
+   *            where the actual data starts.
+   */
+  static uint32_t IdentifyDataOffset(const char* aData,
+                                     const uint32_t aLength,
+                                     const char*& aRetval);
+
+  /**
+   * Implements get an encoding algorithm from Encoding spec.
+   * http://dvcs.w3.org/hg/encoding/raw-file/tip/Overview.html#concept-encoding-get
+   * Given a label, this function returns the corresponding encoding or a
+   * false.
+   *
+   * @param      aLabel, incoming label describing charset to be decoded.
+   * @param      aRetEncoding, returning corresponding encoding for label.
+   * @return     false if no encoding was found for label.
+   *             true if valid encoding found.
+   */
+  static bool FindEncodingForLabel(const nsAString& aLabel,
+                                   const char*& aOutEncoding);
+
+  /**
+   * Remove any leading and trailing space characters, following the
+   * definition of space characters from Encoding spec.
+   * http://dvcs.w3.org/hg/encoding/raw-file/tip/Overview.html#terminology
+   * Note that nsAString::StripWhitespace() doesn't exactly match the
+   * definition. It also removes all matching chars in the string,
+   * not just leading and trailing.
+   *
+   * @param      aString, string to be trimmed.
+   */
+  static void TrimSpaceCharacters(nsString& aString)
+  {
+    aString.Trim(" \t\n\f\r");
+  }
+
+  /* Called to free up Encoding instance. */
+  static void Shutdown();
+
+protected:
+  nsDataHashtable<nsStringHashKey, const char *> mLabelsEncodings;
+  EncodingUtils();
+  virtual ~EncodingUtils();
+  static already_AddRefed<EncodingUtils> GetOrCreate();
+};
+
+} // dom
+} // mozilla
+
+#endif // mozilla_dom_encodingutils_h_
new file mode 100644
--- /dev/null
+++ b/dom/encoding/Makefile.in
@@ -0,0 +1,38 @@
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DEPTH		= @DEPTH@
+topsrcdir	= @top_srcdir@
+srcdir		= @srcdir@
+VPATH		= @srcdir@
+FAIL_ON_WARNINGS := 1
+
+include $(DEPTH)/config/autoconf.mk
+
+MODULE		= dom
+LIBRARY_NAME	= domencoding_s
+LIBXUL_LIBRARY	= 1
+FORCE_STATIC_LIB = 1
+
+DIRS = \
+  test \
+  $(NULL)
+
+EXPORTS_NAMESPACES = mozilla/dom
+EXPORTS_mozilla/dom = \
+  EncodingUtils.h \
+  TextDecoder.h \
+  TextEncoder.h \
+  $(NULL)
+
+CPPSRCS = \
+	EncodingUtils.cpp \
+	TextDecoder.cpp \
+	TextEncoder.cpp \
+	$(NULL)
+
+include $(topsrcdir)/dom/dom-config.mk
+include $(topsrcdir)/config/config.mk
+include $(topsrcdir)/config/rules.mk
new file mode 100644
--- /dev/null
+++ b/dom/encoding/TextDecoder.cpp
@@ -0,0 +1,263 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/TextDecoder.h"
+#include "mozilla/dom/EncodingUtils.h"
+#include "nsContentUtils.h"
+#include "nsICharsetConverterManager.h"
+#include "nsServiceManagerUtils.h"
+
+namespace mozilla {
+namespace dom {
+
+static const PRUnichar kReplacementChar = static_cast<PRUnichar>(0xFFFD);
+
+void
+TextDecoder::Init(const nsAString& aEncoding,
+                  const TextDecoderOptions& aFatal,
+                  ErrorResult& aRv)
+{
+  nsAutoString label(aEncoding);
+  EncodingUtils::TrimSpaceCharacters(label);
+
+  // If label is a case-insensitive match for "utf-16"
+  // then set the internal useBOM flag.
+  if (label.LowerCaseEqualsLiteral("utf-16")) {
+    mUseBOM = true;
+    mIsUTF16Family = true;
+    mEncoding = "utf-16le";
+    // If BOM is used, we can't determine the converter yet.
+    return;
+  }
+
+  // Run the steps to get an encoding from Encoding.
+  if (!EncodingUtils::FindEncodingForLabel(label, mEncoding)) {
+    // If the steps result in failure,
+    // throw a "EncodingError" exception and terminate these steps.
+    aRv.Throw(NS_ERROR_DOM_ENCODING_NOT_SUPPORTED_ERR);
+    return;
+  }
+
+  mIsUTF16Family = !strcmp(mEncoding, "utf-16le") ||
+                   !strcmp(mEncoding, "utf-16be");
+
+  // If the constructor is called with an options argument,
+  // and the fatal property of the dictionary is set,
+  // set the internal fatal flag of the decoder object.
+  mFatal = aFatal.fatal;
+
+  CreateDecoder(aRv);
+}
+
+void
+TextDecoder::CreateDecoder(ErrorResult& aRv)
+{
+  // Create a decoder object for mEncoding.
+  nsCOMPtr<nsICharsetConverterManager> ccm =
+    do_GetService(NS_CHARSETCONVERTERMANAGER_CONTRACTID);
+  if (!ccm) {
+    aRv.Throw(NS_ERROR_UNEXPECTED);
+    return;
+  }
+
+  ccm->GetUnicodeDecoder(mEncoding, getter_AddRefs(mDecoder));
+  if (!mDecoder) {
+    aRv.Throw(NS_ERROR_UNEXPECTED);
+    return;
+  }
+
+  if (mFatal) {
+    mDecoder->SetInputErrorBehavior(nsIUnicodeDecoder::kOnError_Signal);
+  }
+}
+
+void
+TextDecoder::ResetDecoder(bool aResetOffset)
+{
+  mDecoder->Reset();
+  if (aResetOffset) {
+    mOffset = 0;
+  }
+}
+
+void
+TextDecoder::Decode(const ArrayBufferView* aView,
+                    const TextDecodeOptions& aOptions,
+                    nsAString& aOutDecodedString,
+                    ErrorResult& aRv)
+{
+  const char* data;
+  uint32_t length;
+  // If view is not specified, let view be a Uint8Array of length 0.
+  if (!aView) {
+    data = EmptyCString().BeginReading();
+    length = EmptyCString().Length();
+  } else {
+    data = reinterpret_cast<const char*>(aView->Data());
+    length = aView->Length();
+  }
+
+  aOutDecodedString.Truncate();
+  if (mIsUTF16Family && mOffset < 2) {
+    HandleBOM(data, length, aOptions, aOutDecodedString, aRv);
+    if (aRv.Failed() || mOffset < 2) {
+      return;
+    }
+  }
+
+  // Run or resume the decoder algorithm of the decoder object's encoder.
+  int32_t outLen;
+  nsresult rv = mDecoder->GetMaxLength(data, length, &outLen);
+  if (NS_FAILED(rv)) {
+    aRv.Throw(rv);
+    return;
+  }
+  // Need a fallible allocator because the caller may be a content
+  // and the content can specify the length of the string.
+  static const fallible_t fallible = fallible_t();
+  nsAutoArrayPtr<PRUnichar> buf(new (fallible) PRUnichar[outLen + 1]);
+  if (!buf) {
+    aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
+    return;
+  }
+
+  for (;;) {
+    int32_t srcLen = length;
+    int32_t dstLen = outLen;
+    rv = mDecoder->Convert(data, &srcLen, buf, &dstLen);
+    // Convert will convert the input partially even if the status
+    // indicates a failure.
+    buf[dstLen] = 0;
+    aOutDecodedString.Append(buf, dstLen);
+    if (mFatal || rv != NS_ERROR_ILLEGAL_INPUT) {
+      break;
+    }
+    // Emit a decode error manually because some decoders
+    // do not support kOnError_Recover (bug 638379)
+    if (srcLen == -1) {
+      ResetDecoder();
+    } else {
+      data += srcLen + 1;
+      length -= srcLen + 1;
+      aOutDecodedString.Append(kReplacementChar);
+    }
+  }
+
+  // If the internal streaming flag of the decoder object is not set,
+  // then reset the encoding algorithm state to the default values
+  if (!aOptions.stream) {
+    ResetDecoder();
+    if (rv == NS_OK_UDEC_MOREINPUT) {
+      if (mFatal) {
+        aRv.Throw(NS_ERROR_DOM_ENCODING_DECODE_ERR);
+      } else {
+        // Need to emit a decode error manually
+        // to simulate the EOF handling of the Encoding spec.
+        aOutDecodedString.Append(kReplacementChar);
+      }
+    }
+  }
+
+  if (NS_FAILED(rv)) {
+    aRv.Throw(NS_ERROR_DOM_ENCODING_DECODE_ERR);
+  }
+}
+
+void
+TextDecoder::HandleBOM(const char*& aData, uint32_t& aLength,
+                       const TextDecodeOptions& aOptions,
+                       nsAString& aOutString, ErrorResult& aRv)
+{
+  if (aLength < 2u - mOffset) {
+    if (aOptions.stream) {
+      memcpy(mInitialBytes + mOffset, aData, aLength);
+      mOffset += aLength;
+    } else if (mFatal) {
+      aRv.Throw(NS_ERROR_DOM_ENCODING_DECODE_ERR);
+    } else {
+      aOutString.Append(kReplacementChar);
+    }
+    return;
+  }
+
+  memcpy(mInitialBytes + mOffset, aData, 2 - mOffset);
+  // copied data will be fed later.
+  aData += 2 - mOffset;
+  aLength -= 2 - mOffset;
+  mOffset = 2;
+
+  const char* encoding = "";
+  if (!EncodingUtils::IdentifyDataOffset(mInitialBytes, 2, encoding) ||
+      strcmp(encoding, mEncoding)) {
+    // If the stream doesn't start with BOM or the BOM doesn't match the
+    // encoding, feed a BOM to workaround decoder's bug (bug 634541).
+    if (!mUseBOM) {
+      FeedBytes(!strcmp(mEncoding, "utf-16le") ? "\xFF\xFE" : "\xFE\xFF");
+    }
+  }
+  if (mUseBOM) {
+    // Select a decoder corresponding to the BOM.
+    if (!*encoding) {
+      encoding = "utf-16le";
+    }
+    // If the endian has not been changed, reuse the decoder.
+    if (mDecoder && !strcmp(encoding, mEncoding)) {
+      ResetDecoder(false);
+    } else {
+      mEncoding = encoding;
+      CreateDecoder(aRv);
+    }
+  }
+  FeedBytes(mInitialBytes, &aOutString);
+}
+
+void
+TextDecoder::FeedBytes(const char* aBytes, nsAString* aOutString)
+{
+  PRUnichar buf[3];
+  int32_t srcLen = mOffset;
+  int32_t dstLen = mozilla::ArrayLength(buf);
+  DebugOnly<nsresult> rv =
+    mDecoder->Convert(aBytes, &srcLen, buf, &dstLen);
+  MOZ_ASSERT(NS_SUCCEEDED(rv));
+  MOZ_ASSERT(srcLen == mOffset);
+  if (aOutString) {
+    aOutString->Assign(buf, dstLen);
+  }
+}
+
+void
+TextDecoder::GetEncoding(nsAString& aEncoding)
+{
+  // Our utf-16 converter does not comply with the Encoding Standard.
+  // As a result the utf-16le converter is used for the encoding label
+  // "utf-16".
+  // This workaround should not be exposed to the public API and so "utf-16"
+  // is returned by GetEncoding() if the internal encoding name is "utf-16le".
+  if (mUseBOM || !strcmp(mEncoding, "utf-16le")) {
+    aEncoding.AssignLiteral("utf-16");
+    return;
+  }
+
+  // Similarly, "x-windows-949" is used for the "euc-kr" family. Therefore, if
+  // the internal encoding name is "x-windows-949", "euc-kr" is returned.
+  if (!strcmp(mEncoding, "x-windows-949")) {
+    aEncoding.AssignLiteral("euc-kr");
+    return;
+  }
+
+  aEncoding.AssignASCII(mEncoding);
+}
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(TextDecoder)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(TextDecoder)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TextDecoder)
+  NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_1(TextDecoder, mGlobal)
+
+} // dom
+} // mozilla
new file mode 100644
--- /dev/null
+++ b/dom/encoding/TextDecoder.h
@@ -0,0 +1,131 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_textdecoder_h_
+#define mozilla_dom_textdecoder_h_
+
+#include "jsapi.h"
+#include "mozilla/dom/BindingUtils.h"
+#include "mozilla/dom/TextDecoderBinding.h"
+#include "mozilla/dom/TypedArray.h"
+#include "mozilla/ErrorResult.h"
+#include "nsIUnicodeDecoder.h"
+#include "nsString.h"
+
+#include "nsCOMPtr.h"
+#include "nsCycleCollectionParticipant.h"
+
+namespace mozilla {
+namespace dom {
+
+class TextDecoder : public nsISupports, public nsWrapperCache
+{
+public:
+  NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+  NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(TextDecoder)
+
+  // The WebIDL constructor.
+  static already_AddRefed<TextDecoder>
+  Constructor(nsISupports* aGlobal,
+              const nsAString& aEncoding,
+              const TextDecoderOptions& aFatal,
+              ErrorResult& aRv)
+  {
+    nsRefPtr<TextDecoder> txtDecoder = new TextDecoder(aGlobal);
+    txtDecoder->Init(aEncoding, aFatal, aRv);
+    if (aRv.Failed()) {
+      return nullptr;
+    }
+    return txtDecoder.forget();
+  }
+
+  TextDecoder(nsISupports* aGlobal)
+    : mGlobal(aGlobal)
+    , mFatal(false), mUseBOM(false), mOffset(0), mIsUTF16Family(false)
+  {
+    MOZ_ASSERT(aGlobal);
+    SetIsDOMBinding();
+  }
+
+  virtual
+  ~TextDecoder()
+  {}
+
+  virtual JSObject*
+  WrapObject(JSContext* aCx, JSObject* aScope, bool* aTriedToWrap)
+  {
+    return TextDecoderBinding::Wrap(aCx, aScope, this, aTriedToWrap);
+  }
+
+  nsISupports*
+  GetParentObject()
+  {
+    return mGlobal;
+  }
+
+  /**
+   * Return the encoding name.
+   *
+   * @param aEncoding, current encoding.
+   */
+  void GetEncoding(nsAString& aEncoding);
+
+  /**
+   * Decodes incoming byte stream of characters in charset indicated by
+   * encoding.
+   *
+   * The encoding algorithm state is reset if aOptions.stream is not set.
+   *
+   * If the fatal flag is set then a decoding error will throw EncodingError.
+   * Else the decoder will return a decoded string with replacement
+   * character(s) for unidentified character(s).
+   *
+   * @param      aView, incoming byte stream of characters to be decoded to
+   *                    to UTF-16 code points.
+   * @param      aOptions, indicates if streaming or not.
+   * @param      aOutDecodedString, decoded string of UTF-16 code points.
+   * @param      aRv, error result.
+   */
+  void Decode(const ArrayBufferView* aView,
+              const TextDecodeOptions& aOptions,
+              nsAString& aOutDecodedString,
+              ErrorResult& aRv);
+
+private:
+  const char* mEncoding;
+  nsCOMPtr<nsIUnicodeDecoder> mDecoder;
+  nsCOMPtr<nsISupports> mGlobal;
+  bool mFatal;
+  bool mUseBOM;
+  uint8_t mOffset;
+  char mInitialBytes[3];
+  bool mIsUTF16Family;
+
+  /**
+   * Validates provided encoding and throws an exception if invalid encoding.
+   * If no encoding is provided then mEncoding is default initialised to "utf-8".
+   *
+   * @param aEncoding    Optional encoding (case insensitive) provided.
+   *                     Default value is "utf-8" if no encoding is provided.
+   * @param aFatal       aFatal, indicates whether to throw an 'EncodingError'
+   *                     exception or not.
+   * @return aRv         EncodingError exception else null.
+   */
+  void Init(const nsAString& aEncoding,
+            const TextDecoderOptions& aFatal,
+            ErrorResult& aRv);
+
+  // Internal helper functions.
+  void CreateDecoder(ErrorResult& aRv);
+  void ResetDecoder(bool aResetOffset = true);
+  void HandleBOM(const char*& aData, uint32_t& aLength,
+                 const TextDecodeOptions& aOptions,
+                 nsAString& aOutString, ErrorResult& aRv);
+  void FeedBytes(const char* aBytes, nsAString* aOutString = nullptr);
+};
+
+} // dom
+} // mozilla
+
+#endif // mozilla_dom_textdecoder_h_
new file mode 100644
--- /dev/null
+++ b/dom/encoding/TextEncoder.cpp
@@ -0,0 +1,136 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/TextEncoder.h"
+#include "mozilla/dom/EncodingUtils.h"
+#include "nsContentUtils.h"
+#include "nsICharsetConverterManager.h"
+#include "nsServiceManagerUtils.h"
+
+namespace mozilla {
+namespace dom {
+
+void
+TextEncoder::Init(const Optional<nsAString>& aEncoding,
+                  ErrorResult& aRv)
+{
+  // If the constructor is called with no arguments, let label be the "utf-8".
+  // Otherwise, let label be the value of the encoding argument.
+  nsAutoString label;
+  if (!aEncoding.WasPassed()) {
+    label.AssignLiteral("utf-8");
+  } else {
+    label.Assign(aEncoding.Value());
+    EncodingUtils::TrimSpaceCharacters(label);
+  }
+
+  // Run the steps to get an encoding from Encoding.
+  if (!EncodingUtils::FindEncodingForLabel(label, mEncoding)) {
+    // If the steps result in failure,
+    // throw an "EncodingError" exception and terminate these steps.
+    aRv.Throw(NS_ERROR_DOM_ENCODING_NOT_SUPPORTED_ERR);
+    return;
+  }
+
+  // Otherwise, if the Name of the returned encoding is not one of
+  // "utf-8", "utf-16", or "utf-16be" throw an "EncodingError" exception
+  // and terminate these steps.
+  if (PL_strcasecmp(mEncoding, "utf-8") &&
+      PL_strcasecmp(mEncoding, "utf-16le") &&
+      PL_strcasecmp(mEncoding, "utf-16be")) {
+    aRv.Throw(NS_ERROR_DOM_ENCODING_NOT_UTF_ERR);
+    return;
+  }
+
+  // Create an encoder object for mEncoding.
+  nsCOMPtr<nsICharsetConverterManager> ccm =
+    do_GetService(NS_CHARSETCONVERTERMANAGER_CONTRACTID);
+  if (!ccm) {
+    aRv.Throw(NS_ERROR_UNEXPECTED);
+    return;
+  }
+
+  ccm->GetUnicodeEncoder(mEncoding, getter_AddRefs(mEncoder));
+  if (!mEncoder) {
+    aRv.Throw(NS_ERROR_UNEXPECTED);
+    return;
+  }
+}
+
+JSObject*
+TextEncoder::Encode(JSContext* aCx,
+                    const nsAString& aString,
+                    const TextEncodeOptions& aOptions,
+                    ErrorResult& aRv)
+{
+  // Run the steps of the encoding algorithm.
+  int32_t srcLen = aString.Length();
+  int32_t maxLen;
+  const PRUnichar* data = PromiseFlatString(aString).get();
+  nsresult rv = mEncoder->GetMaxLength(data, srcLen, &maxLen);
+  if (NS_FAILED(rv)) {
+    aRv.Throw(rv);
+    return nullptr;
+  }
+  // Need a fallible allocator because the caller may be a content
+  // and the content can specify the length of the string.
+  static const fallible_t fallible = fallible_t();
+  nsAutoArrayPtr<char> buf(new (fallible) char[maxLen + 1]);
+  if (!buf) {
+    aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
+    return nullptr;
+  }
+
+  int32_t dstLen = maxLen;
+  rv = mEncoder->Convert(data, &srcLen, buf, &dstLen);
+
+  // If the internal streaming flag is not set, then reset
+  // the encoding algorithm state to the default values for encoding.
+  if (!aOptions.stream) {
+    int32_t finishLen = maxLen - dstLen;
+    rv = mEncoder->Finish(buf + dstLen, &finishLen);
+    if (NS_SUCCEEDED(rv)) {
+      dstLen += finishLen;
+    }
+  }
+
+  JSObject* outView = nullptr;
+  if (NS_SUCCEEDED(rv)) {
+    buf[dstLen] = '\0';
+    outView = Uint8Array::Create(aCx, this, dstLen,
+                                 reinterpret_cast<uint8_t*>(buf.get()));
+  }
+
+  if (NS_FAILED(rv)) {
+    aRv.Throw(rv);
+  }
+  return outView;
+}
+
+void
+TextEncoder::GetEncoding(nsAString& aEncoding)
+{
+  // Our utf-16 converter does not comply with the Encoding Standard.
+  // As a result the utf-16le converter is used for the encoding label
+  // "utf-16".
+  // This workaround should not be exposed to the public API and so "utf-16"
+  // is returned by GetEncoding() if the internal encoding name is "utf-16le".
+  if (!strcmp(mEncoding, "utf-16le")) {
+    aEncoding.AssignLiteral("utf-16");
+    return;
+  }
+  aEncoding.AssignASCII(mEncoding);
+}
+
+NS_IMPL_CYCLE_COLLECTING_ADDREF(TextEncoder)
+NS_IMPL_CYCLE_COLLECTING_RELEASE(TextEncoder)
+
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TextEncoder)
+  NS_INTERFACE_MAP_ENTRY(nsISupports)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_1(TextEncoder, mGlobal)
+
+} // dom
+} // mozilla
new file mode 100644
--- /dev/null
+++ b/dom/encoding/TextEncoder.h
@@ -0,0 +1,108 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_textencoder_h_
+#define mozilla_dom_textencoder_h_
+
+#include "jsapi.h"
+#include "mozilla/dom/BindingUtils.h"
+#include "mozilla/dom/TextEncoderBinding.h"
+#include "mozilla/dom/TypedArray.h"
+#include "mozilla/ErrorResult.h"
+#include "nsIUnicodeEncoder.h"
+#include "nsString.h"
+
+#include "nsCOMPtr.h"
+#include "nsCycleCollectionParticipant.h"
+
+namespace mozilla {
+namespace dom {
+
+class TextEncoder : public nsISupports, public nsWrapperCache
+{
+public:
+  NS_DECL_CYCLE_COLLECTING_ISUPPORTS
+  NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(TextEncoder)
+
+  // The WebIDL constructor.
+  static already_AddRefed<TextEncoder>
+  Constructor(nsISupports* aGlobal,
+              const Optional<nsAString>& aEncoding,
+              ErrorResult& aRv)
+  {
+    nsRefPtr<TextEncoder> txtEncoder = new TextEncoder(aGlobal);
+    txtEncoder->Init(aEncoding, aRv);
+    if (aRv.Failed()) {
+      return nullptr;
+    }
+    return txtEncoder.forget();
+  }
+
+  TextEncoder(nsISupports* aGlobal)
+    : mGlobal(aGlobal)
+  {
+    MOZ_ASSERT(aGlobal);
+    SetIsDOMBinding();
+  }
+
+  virtual
+  ~TextEncoder()
+  {}
+
+  virtual JSObject*
+  WrapObject(JSContext* aCx, JSObject* aScope, bool* aTriedToWrap)
+  {
+    return TextEncoderBinding::Wrap(aCx, aScope, this, aTriedToWrap);
+  }
+
+  nsISupports*
+  GetParentObject()
+  {
+    return mGlobal;
+  }
+
+  /**
+   * Return the encoding name.
+   *
+   * @param aEncoding, current encoding.
+   */
+  void GetEncoding(nsAString& aEncoding);
+
+  /**
+   * Encodes incoming utf-16 code units/ DOM string to the requested encoding.
+   *
+   * @param aCx        Javascript context.
+   * @param aString    utf-16 code units to be encoded.
+   * @param aOptions   Streaming option. Initialised by default to false.
+   *                   If the streaming option is false, then the encoding
+   *                   algorithm state will get reset. If set to true then
+   *                   the previous encoding is reused/continued.
+   * @return JSObject* The Uint8Array wrapped in a JS object.
+   */
+  JSObject* Encode(JSContext* aCx,
+                   const nsAString& aString,
+                   const TextEncodeOptions& aOptions,
+                   ErrorResult& aRv);
+private:
+  const char* mEncoding;
+  nsCOMPtr<nsIUnicodeEncoder> mEncoder;
+  nsCOMPtr<nsISupports> mGlobal;
+
+  /**
+   * Validates provided encoding and throws an exception if invalid encoding.
+   * If no encoding is provided then mEncoding is default initialised to "utf-8".
+   *
+   * @param aEncoding    Optional encoding (case insensitive) provided.
+   *                     (valid values are "utf-8", "utf-16", "utf-16be")
+   *                     Default value is "utf-8" if no encoding is provided.
+   * @return aRv         EncodingError exception else null.
+   */
+  void Init(const Optional<nsAString>& aEncoding,
+            ErrorResult& aRv);
+};
+
+} // dom
+} // mozilla
+
+#endif // mozilla_dom_textencoder_h_
new file mode 100644
--- /dev/null
+++ b/dom/encoding/test/Makefile.in
@@ -0,0 +1,32 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DEPTH = @DEPTH@
+topsrcdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = @srcdir@
+relativesrcdir = @relativesrcdir@
+
+include $(DEPTH)/config/autoconf.mk
+
+MOCHITEST_FILES = \
+  test_BOMEncoding.js \
+  test_TextDecoder.html \
+  test_TextDecoder.js \
+  test_TextEncoder.html \
+  test_TextEncoder.js \
+  test-big5.js \
+  test-euc-jp.js \
+  test-euc-kr.js \
+  test-gbk.js \
+  test-hz-gb-2312.js \
+  test-iso-2022-jp.js \
+  test-iso-2022-kr.js \
+  test-shift_jis.js \
+  test_stringencoding.html \
+  tests.js \
+  $(NULL)
+
+include $(topsrcdir)/config/rules.mk
+
new file mode 100644
--- /dev/null
+++ b/dom/encoding/test/stringencoding-license.txt
@@ -0,0 +1,12 @@
+The following files are licensed under Apache License 2.0 <https://www.apache.org/licenses/LICENSE-2.0
+>:
+test-big5.js
+test-euc-jp.js
+test-euc-kr.js
+test-gbk.js
+test-hz-gb-2312.js
+test-iso-2022-jp.js
+test-iso-2022-kr.js
+test-shift_jis.js
+test_stringencoding.html
+tests.js
new file mode 100644
--- /dev/null
+++ b/dom/encoding/test/test-big5.js
@@ -0,0 +1,10 @@
+test(
+  "big5",
+  function () {
+    var bytes = [161,64,161,65,161,66,161,67,161,68,161,70,161,71,161,72,161,73,161,74,161,75,161,76,161,77,161,79,161,80,161,81,161,82,161,83,161,84,161,85,161,86,161,87,161,88,161,89,161,90,161,91,161,92,161,93,161,94,161,95,161,96,161,97,161,98,161,99,161,100,161,101,161,102,161,103,161,104,161,105,161,106,161,107,161,108,161,109,161,110,161,111,161,112,161,113,161,114,161,115,161,116,161,117,161,118,161,119,161,120,161,121,161,122,161,123,161,124,161,125,161,126,161,161,161,162,161,163,161,164,161,165,161,166,161,167,161,168,161,169,161,170,161,171,161,172,161,173,161,174,161,175,161,176,161,177,161,178,161,179,161,180,161,181,161,182,161,183,161,184,161,185,161,186,161,187,161,188,161,189,161,190,161,191,161,192,161,193,161,195,161,196,161,197,161,198,161,199,161,200,161,201,161,202,161,203,161,204,161,205,161,206,161,207,161,208,161,209,161,210,161,211,161,212,161,213,161,214,161,215,161,216,161,217,161,218,161,219,161,220,161,221,161,222,161,223,161,224,161,225,161,226,161,228,161,229,161,230,161,231,161,232,161,233,161,234,161,235,161,236,161,237,161,238,161,239,161,240,161,241,161,244,161,245,161,246,161,247,161,248,161,249,161,250,161,251,161,252,161,253,162,67,162,69,162,72,162,73,162,74,162,75,162,76,162,77,162,78,162,79,162,80,162,81,162,82,162,83,162,84,162,85,162,86,162,87,162,88,162,93,162,94,162,95,162,96,162,98,162,99,162,100,162,101,162,102,162,103,162,104,162,105,162,106,162,107,162,108,162,109,162,110,162,111,162,112,162,113,162,114,162,115,162,116,162,117,162,118,162,119,162,120,162,121,162,122,162,123,162,124,162,125,162,126,162,161,162,162,162,163,162,164,162,165,162,166,162,167,162,168,162,169,162,170,162,171,162,172,162,173,162,174,162,175,162,176,162,177,162,178,162,179,162,180,162,181,162,182,162,183,162,184,162,185,162,186,162,187,162,188,162,189,162,190,162,191,162,192,162,193,162,194,162,195,162,196,162,197,162,198,162,199,162,200,162,201,162,202,162,203,162,205,162,207,162,208,162,209,162,210,162,211,162,212,162,213,162,214,162,215,162,216,162,217,162,218,162,219,162,220,162,221,162,222,162,223,162,224,162,225,162,226,162,227,162,228,162,229,162,230,162,231,162,232,162,233,162,234,162,235,162,236,162,237,162,238,162,239,162,240,162,241,162,242,162,243,162,244,162,245,162,246,162,247,162,248,162,249,162,250,162,251,162,252,162,253,162,254,163,64,163,65,163,66,163,67,163,68,163,69,163,70,163,71,163,72,163,73,163,74,163,75,163,76,163,77,163,78,163,79,163,80,163,81,163,82,163,83,163,84,163,85,163,86,163,87,163,88,163,89,163,90,163,91,163,92,163,93,163,94,163,95,163,96,163,97,163,98,163,99,163,100,163,101,163,102,163,103,163,104,163,105,163,106,163,107,163,108,163,109,163,110,163,111,163,112,163,113,163,114,163,115,163,116,163,117,163,118,163,119,163,120,163,121,163,122,163,123,163,124,163,125,163,126,163,161,163,162,163,163,163,164,163,165,163,166,163,167,163,168,163,169,163,170,163,171,163,172,163,173,163,174,163,175,163,176,163,177,163,178,163,179,163,180,163,181,163,182,163,183,163,184,163,185,163,186,163,187,163,188,163,189,163,190,163,191,164,64,164,65,164,66,164,67,164,68,164,69,164,70,164,71,164,72,164,73,164,74,164,75,164,76,164,77,164,78,164,79,164,80,164,82,164,83,164,84,164,85,164,86,164,87,164,88,164,89,164,90,164,91,164,92,164,93,164,94,164,95,164,96,164,97,164,98,164,99,164,100,164,101,164,102,164,103,164,104,164,105,164,106,164,107,164,108,164,109,164,110,164,111,164,112,164,113,164,114,164,115,164,116,164,117,164,118,164,119,164,120,164,121,164,122,164,123,164,124,164,125,164,126,164,161,164,162,164,163,164,164,164,165,164,166,164,167,164,168,164,169,164,170,164,171,164,172,164,173,164,174,164,175,164,176,164,177,164,178,164,179,164,180,164,181,164,182,164,183,164,184,164,185,164,186,164,187,164,188,164,189,164,190,164,191,164,192,164,193,164,194,164,195,164,196,164,197,164,198,164,199,164,200,164,201,164,203,164,204,164,205,164,206,164,207,164,208,164,209,164,210,164,211,164,212,164,213,164,214,164,215,164,216,164,217,164,218,164,219,164,220,164,221,164,222,164,223,164,224,164,225,164,226,164,227,164,228,164,229,164,230,164,231,164,232,164,233,164,234,164,235,164,236,164,237,164,238,164,239,164,240,164,241,164,242,164,243,164,244,164,245,164,246,164,247,164,248,164,249,164,250,164,251,164,252,164,253,164,254,165,64,165,65,165,66,165,67,165,68,165,69,165,70,165,71,165,72,165,73,165,74,165,75,165,76,165,77,165,78,165,79,165,80,165,81,165,82,165,83,165,84,165,85,165,86,165,87,165,88,165,89,165,90,165,91,165,92,165,93,165,94,165,95,165,96,165,97,165,98,165,99,165,100,165,101,165,102,165,103,165,104,165,105,165,106,165,107,165,108,165,109,165,110,165,111,165,112,165,113,165,114,165,115,165,116,165,117,165,118,165,119,165,120,165,121,165,122,165,123,165,124,165,125,165,126,165,161,165,162,165,163,165,164,165,165,165,166,165,167,165,168,165,169,165,170,165,171,165,172,165,173,165,174,165,175,165,176,165,177,165,178,165,179,165,180,165,181,165,182,165,183,165,184,165,185,165,186,165,187,165,188,165,189,165,190,165,191,165,192,165,193,165,194,165,195,165,196,165,197,165,198,165,199,165,200,165,201,165,202,165,203,165,204,165,205,165,206,165,207,165,208,165,209,165,210,165,211,165,212,165,213,165,214,165,215,165,216,165,217,165,218,165,219,165,220,165,221,165,222,165,223,165,224,165,225,165,226,165,227,165,228,165,229,165,230,165,231,165,232,165,233,165,234,165,235,165,236,165,237,165,238,165,239,165,240,165,241,165,242,165,243,165,244,165,245,165,246,165,247,165,248,165,249,165,250,165,251,165,252,165,253,165,254,166,64,166,65,166,66,166,67,166,68,166,69,166,70,166,71,166,72,166,73,166,74,166,75,166,76,166,77,166,78,166,79,166,80,166,81,166,82,166,83,166,84,166,85,166,86,166,87,166,88,166,89,166,90,166,91,166,92,166,93,166,94,166,95,166,96,166,97,166,98,166,99,166,100,166,101,166,102,166,103,166,104,166,105,166,106,166,107,166,108,166,109,166,110,166,111,166,112,166,113,166,114,166,115,166,116,166,117,166,118,166,119,166,120,166,121,166,122,166,123,166,124,166,125,166,126,166,161,166,162,166,163,166,164,166,165,166,166,166,167,166,168,166,169,166,170,166,171,166,172,166,173,166,174,166,175,166,176,166,177,166,178,166,179,166,180,166,181,166,182,166,183,166,184,166,185,166,186,166,187,166,188,166,189,166,190,166,191,166,192,166,193,166,194,166,195,166,196,166,197,166,198,166,199,166,200,166,201,166,202,166,203,166,204,166,205,166,206,166,207,166,208,166,209,166,210,166,211,166,212,166,213,166,214,166,215,166,216,166,217,166,218,166,219,166,220,166,221,166,222,166,223,166,224,166,225,166,226,166,227,166,228,166,229,166,230,166,231,166,232,166,233,166,234,166,235,166,236,166,237,166,238,166,239,166,240,166,241,166,242,166,243,166,244,166,245,166,246,166,247,166,248,166,249,166,250,166,251,166,252,166,253,166,254,167,64,167,65,167,66,167,67,167,68,167,69,167,70,167,71,167,72,167,73,167,74,167,75,167,76,167,77,167,78,167,79,167,80,167,81,167,82,167,83,167,84,167,85,167,86,167,87,167,88,167,89,167,90,167,91,167,92,167,93,167,94,167,95,167,96,167,97,167,98,167,99,167,100,167,101,167,102,167,103,167,104,167,105,167,106,167,107,167,108,167,109,167,110,167,111,167,112,167,113,167,114,167,115,167,116,167,117,167,118,167,119,167,120,167,121,167,122,167,123,167,124,167,125,167,126,167,161,167,162,167,163,167,164,167,165,167,166,167,167,167,168,167,169,167,170,167,171,167,172,167,173,167,174,167,175,167,176,167,177,167,178,167,179,167,180,167,181,167,182,167,183,167,184,167,185,167,186,167,187,167,188,167,189,167,190,167,191,167,192,167,193,167,194,167,195,167,196,167,197,167,198,167,199,167,200,167,201,167,202,167,203,167,204,167,205,167,206,167,207,167,208,167,209,167,210,167,211,167,212,167,213,167,214,167,215,167,216,167,217,167,218,167,219,167,220,167,221,167,222,167,223,167,224,167,225,167,226,167,227,167,228,167,229,167,230,167,231,167,232,167,233,167,234,167,235,167,236,167,237,167,238,167,239,167,240,167,241,167,242,167,243,167,244,167,245,167,246,167,247,167,248,167,249,167,250,167,251,167,252,167,253,167,254,168,64,168,65,168,66,168,67,168,68,168,69,168,70,168,71,168,72,168,73,168,74,168,75,168,76,168,77,168,78,168,79,168,80,168,81,168,82,168,83,168,84,168,85,168,86,168,87,168,88,168,89,168,90,168,91,168,92,168,93,168,94,168,95,168,96,168,97,168,98,168,99,168,100,168,101,168,102,168,103,168,104,168,105,168,106,168,107,168,108,168,109,168,110,168,111,168,112,168,113,168,114,168,115,168,116,168,117,168,118,168,119,168,120,168,121,168,122,168,123,168,124,168,125,168,126,168,161,168,162,168,163,168,164,168,165,168,166,168,167,168,168,168,169,168,170,168,171,168,172,168,173,168,174,168,175,168,176,168,177,168,178,168,179,168,180,168,181,168,182,168,183,168,184,168,185,168,186,168,187,168,188,168,189,168,190,168,191,168,192,168,193,168,194,168,195,168,196,168,197,168,198,168,199,168,200,168,201,168,202,168,203,168,204,168,205,168,206,168,207,168,208,168,209,168,210,168,211,168,212,168,213,168,214,168,215,168,216,168,217,168,218,168,219,168,220,168,221,168,222,168,223,168,224,168,225,168,226,168,227,168,228,168,229,168,230,168,231,168,232,168,233,168,234,168,235,168,236,168,237,168,238,168,239,168,240,168,241,168,242,168,243,168,244,168,245,168,246,168,247,168,248,168,249,168,250,168,251,168,252,168,253,168,254,169,64,169,65,169,66,169,67,169,68,169,69,169,70,169,71,169,72,169,73,169,74,169,75,169,76,169,77,169,78,169,79,169,80,169,81,169,82,169,83,169,84,169,85,169,86,169,87,169,88,169,89,169,90,169,91,169,92,169,93,169,94,169,95,169,96,169,97,169,98,169,99,169,100,169,101,169,102,169,103,169,104,169,105,169,106,169,107,169,108,169,109,169,110,169,111,169,112,169,113,169,114,169,115,169,116,169,117,169,118,169,119,169,120,169,121,169,122,169,123,169,124,169,125,169,126,169,161,169,162,169,163,169,164,169,165,169,166,169,167,169,168,169,169,169,170,169,171,169,172,169,173,169,174,169,175,169,176,169,177,169,178,169,179,169,180,169,181,169,182,169,183,169,184,169,185,169,186,169,187,169,188,169,189,169,190,169,191,169,192,169,193,169,194,169,195,169,196,169,197,169,198,169,199,169,200,169,201,169,202,169,203,169,204,169,205,169,206,169,207,169,208,169,209,169,210,169,211,169,212,169,213,169,214,169,215,169,216,169,217,169,218,169,219,169,220,169,221,169,222,169,223,169,224,169,225,169,226,169,227,169,229,169,230,169,231,169,232,169,233,169,234,169,235,169,236,169,237,169,238,169,239,169,241,169,242,169,243,169,244,169,245,169,246,169,247,169,248,169,249,169,250,169,251,169,252,169,253,169,254,170,64,170,65,170,66,170,67,170,68,170,69,170,70,170,71,170,72,170,73,170,74,170,75,170,76,170,77,170,78,170,79,170,80,170,81,170,82,170,83,170,84,170,85,170,86,170,87,170,88,170,89,170,90,170,91,170,92,170,93,170,94,170,95,170,96,170,97,170,98,170,99,170,100,170,101,170,102,170,103,170,104,170,105,170,106,170,107,170,108,170,109,170,110,170,111,170,112,170,113,170,114,170,115,170,116,170,117,170,118,170,119,170,120,170,121,170,122,170,123,170,124,170,125,170,126,170,161,170,162,170,163,170,164,170,165,170,166,170,167,170,168,170,169,170,170,170,171,170,172,170,173,170,174,170,175,170,176,170,177,170,178,170,179,170,180,170,181,170,182,170,183,170,184,170,185,170,186,170,187,170,188,170,189,170,190,170,191,170,192,170,193,170,194,170,195,170,196,170,197,170,198,170,199,170,200,170,201,170,202,170,203,170,205,170,206,170,207,170,208,170,209,170,210,170,211,170,212,170,213,170,214,170,215,170,216,170,217,170,218,170,219,170,220,170,221,170,222,170,223,170,224,170,225,170,226,170,227,170,228,170,229,170,230,170,231,170,232,170,233,170,234,170,235,170,236,170,237,170,238,170,239,170,240,170,241,170,242,170,243,170,244,170,245,170,246,170,247,170,248,170,249,170,250,170,251,170,252,170,253,170,254,171,64,171,65,171,66,171,67,171,68,171,69,171,70,171,71,171,72,171,73,171,74,171,75,171,76,171,77,171,78,171,79,171,80,171,81,171,82,171,83,171,84,171,85,171,86,171,87,171,88,171,89,171,90,171,91,171,92,171,93,171,94,171,95,171,96,171,97,171,98,171,99,171,100,171,101,171,102,171,103,171,104,171,105,171,106,171,107,171,108,171,109,171,110,171,111,171,112,171,113,171,114,171,115,171,116,171,117,171,118,171,119,171,120,171,121,171,122,171,123,171,124,171,125,171,126,171,161,171,162,171,163,171,164,171,165,171,166,171,167,171,168,171,169,171,170,171,171,171,172,171,173,171,174,171,175,171,176,171,177,171,178,171,179,171,180,171,181,171,182,171,183,171,184,171,185,171,186,171,187,171,188,171,189,171,190,171,191,171,192,171,193,171,194,171,195,171,196,171,197,171,198,171,199,171,200,171,201,171,202,171,203,171,204,171,205,171,206,171,207,171,208,171,209,171,210,171,211,171,212,171,213,171,214,171,215,171,216,171,217,171,218,171,219,171,220,171,221,171,222,171,223,171,224,171,225,171,226,171,227,171,228,171,229,171,230,171,231,171,232,171,233,171,234,171,235,171,237,171,238,171,239,171,240,171,241,171,242,171,243,171,244,171,245,171,246,171,247,171,248,171,249,171,250,171,251,171,252,171,253,171,254,172,64,172,65,172,66,172,67,172,68,172,69,172,70,172,71,172,72,172,73,172,74,172,75,172,76,172,77,172,78,172,79,172,80,172,81,172,82,172,83,172,84,172,85,172,86,172,87,172,88,172,89,172,90,172,91,172,92,172,93,172,94,172,95,172,96,172,97,172,98,172,99,172,100,172,101,172,102,172,103,172,104,172,105,172,106,172,107,172,108,172,109,172,110,172,111,172,112,172,113,172,114,172,115,172,116,172,117,172,118,172,119,172,120,172,121,172,122,172,123,172,124,172,125,172,126,172,161,172,162,172,163,172,164,172,165,172,166,172,167,172,168,172,169,172,170,172,171,172,172,172,173,172,174,172,175,172,176,172,177,172,178,172,179,172,180,172,181,172,182,172,183,172,184,172,185,172,186,172,187,172,188,172,189,172,190,172,191,172,192,172,193,172,194,172,195,172,196,172,197,172,198,172,199,172,200,172,201,172,202,172,203,172,204,172,205,172,206,172,207,172,208,172,209,172,210,172,211,172,212,172,213,172,214,172,215,172,216,172,217,172,218,172,219,172,220,172,221,172,222,172,223,172,224,172,225,172,226,172,227,172,228,172,229,172,230,172,231,172,232,172,233,172,234,172,235,172,236,172,237,172,238,172,239,172,240,172,241,172,242,172,243,172,244,172,245,172,246,172,247,172,248,172,249,172,250,172,251,172,252,172,253,172,254,173,64,173,65,173,66,173,67,173,68,173,69,173,70,173,71,173,72,173,73,173,74,173,75,173,76,173,77,173,78,173,79,173,80,173,81,173,82,173,83,173,84,173,85,173,86,173,87,173,88,173,89,173,90,173,91,173,92,173,93,173,94,173,95,173,96,173,97,173,98,173,99,173,100,173,101,173,102,173,103,173,104,173,105,173,106,173,107,173,108,173,109,173,110,173,111,173,112,173,113,173,114,173,115,173,116,173,117,173,118,173,119,173,120,173,121,173,122,173,123,173,124,173,125,173,126,173,161,173,162,173,163,173,164,173,165,173,166,173,167,173,168,173,169,173,170,173,171,173,172,173,173,173,174,173,175,173,176,173,177,173,178,173,179,173,180,173,181,173,182,173,183,173,184,173,185,173,186,173,187,173,188,173,189,173,190,173,191,173,192,173,193,173,194,173,195,173,196,173,197,173,198,173,199,173,200,173,201,173,202,173,203,173,204,173,205,173,206,173,207,173,208,173,209,173,210,173,211,173,212,173,213,173,214,173,215,173,216,173,217,173,218,173,219,173,220,173,221,173,222,173,223,173,224,173,225,173,226,173,227,173,228,173,229,173,230,173,231,173,232,173,233,173,234,173,235,173,236,173,237,173,238,173,239,173,240,173,241,173,242,173,243,173,244,173,245,173,246,173,247,173,248,173,249,173,250,173,251,173,252,173,253,173,254,174,64,174,65,174,66,174,67,174,68,174,69,174,70,174,71,174,72,174,73,174,74,174,75,174,76,174,77,174,78,174,79,174,80,174,81,174,82,174,83,174,84,174,85,174,86,174,87,174,88,174,89,174,90,174,91,174,92,174,93,174,94,174,95,174,96,174,97,174,98,174,99,174,100,174,101,174,102,174,103,174,104,174,105,174,106,174,107,174,108,174,109,174,110,174,111,174,112,174,113,174,114,174,115,174,116,174,117,174,118,174,119,174,120,174,121,174,122,174,123,174,124,174,125,174,126,174,161,174,162,174,163,174,164,174,165,174,166,174,167,174,168,174,169,174,170,174,171,174,172,174,173,174,174,174,175,174,176,174,177,174,178,174,179,174,180,174,181,174,182,174,183,174,184,174,185,174,186,174,187,174,188,174,189,174,190,174,191,174,192,174,193,174,194,174,195,174,196,174,197,174,198,174,199,174,200,174,201,174,202,174,203,174,204,174,205,174,206,174,207,174,208,174,209,174,210,174,211,174,212,174,213,174,214,174,215,174,216,174,217,174,218,174,219,174,220,174,221,174,222,174,223,174,224,174,225,174,226,174,227,174,228,174,229,174,230,174,231,174,232,174,233,174,234,174,235,174,236,174,237,174,238,174,239,174,240,174,241,174,242,174,243,174,244,174,245,174,246,174,247,174,248,174,249,174,250,174,251,174,252,174,253,174,254,175,64,175,65,175,66,175,67,175,68,175,69,175,70,175,71,175,72,175,73,175,74,175,75,175,76,175,77,175,78,175,79,175,80,175,81,175,82,175,83,175,84,175,85,175,86,175,87,175,88,175,89,175,90,175,91,175,92,175,93,175,94,175,95,175,96,175,97,175,98,175,99,175,100,175,101,175,102,175,103,175,104,175,105,175,106,175,107,175,108,175,109,175,110,175,111,175,112,175,113,175,114,175,115,175,116,175,117,175,118,175,119,175,120,175,121,175,122,175,123,175,124,175,125,175,126,175,161,175,162,175,163,175,164,175,165,175,166,175,167,175,168,175,169,175,170,175,171,175,172,175,173,175,174,175,175,175,177,175,178,175,179,175,180,175,181,175,182,175,183,175,184,175,185,175,186,175,187,175,188,175,189,175,190,175,191,175,192,175,193,175,194,175,195,175,196,175,197,175,198,175,199,175,200,175,201,175,202,175,203,175,204,175,205,175,206,175,207,175,208,175,209,175,210,175,211,175,212,175,213,175,214,175,215,175,216,175,217,175,218,175,219,175,220,175,221,175,222,175,223,175,224,175,225,175,226,175,227,175,228,175,229,175,230,175,231,175,232,175,233,175,234,175,235,175,236,175,237,175,238,175,239,175,240,175,241,175,242,175,243,175,244,175,245,175,246,175,247,175,248,175,249,175,250,175,251,175,252,175,253,175,254,176,64,176,65,176,66,176,67,176,68,176,69,176,70,176,71,176,72,176,73,176,74,176,75,176,76,176,77,176,78,176,79,176,80,176,81,176,82,176,83,176,84,176,85,176,86,176,87,176,88,176,89,176,90,176,91,176,92,176,93,176,94,176,96,176,97,176,98,176,99,176,100,176,101,176,102,176,103,176,104,176,105,176,106,176,107,176,108,176,109,176,110,176,111,176,112,176,113,176,114,176,115,176,116,176,117,176,118,176,119,176,120,176,121,176,122,176,123,176,124,176,125,176,126,176,161,176,162,176,163,176,164,176,165,176,166,176,167,176,168,176,169,176,170,176,171,176,172,176,173,176,174,176,175,176,176,176,177,176,178,176,179,176,180,176,181,176,182,176,183,176,184,176,185,176,186,176,187,176,188,176,189,176,190,176,191,176,192,176,193,176,194,176,195,176,196,176,197,176,198,176,199,176,200,176,201,176,202,176,203,176,204,176,205,176,206,176,207,176,208,176,209,176,210,176,211,176,212,176,213,176,214,176,215,176,216,176,217,176,218,176,219,176,220,176,221,176,222,176,223,176,224,176,225,176,226,176,227,176,228,176,229,176,230,176,231,176,232,176,233,176,234,176,235,176,236,176,237,176,238,176,239,176,240,176,241,176,242,176,243,176,244,176,245,176,246,176,247,176,248,176,249,176,250,176,251,176,252,176,253,176,254,177,64,177,65,177,66,177,67,177,68,177,69,177,70,177,71,177,72,177,73,177,74,177,75,177,76,177,77,177,78,177,79,177,80,177,81,177,82,177,83,177,84,177,85,177,86,177,87,177,88,177,89,177,90,177,91,177,92,177,93,177,94,177,95,177,96,177,97,177,98,177,99,177,100,177,101,177,102,177,103,177,104,177,105,177,106,177,107,177,108,177,109,177,110,177,111,177,112,177,113,177,114,177,115,177,116,177,117,177,118,177,119,177,120,177,121,177,122,177,123,177,124,177,125,177,126,177,161,177,162,177,163,177,164,177,165,177,166,177,167,177,168,177,169,177,170,177,171,177,172,177,173,177,174,177,175,177,176,177,177,177,178,177,179,177,180,177,181,177,182,177,183,177,184,177,185,177,186,177,187,177,188,177,189,177,190,177,191,177,192,177,193,177,194,177,195,177,196,177,197,177,198,177,199,177,200,177,201,177,202,177,203,177,204,177,205,177,206,177,207,177,208,177,209,177,210,177,211,177,212,177,213,177,214,177,215,177,216,177,217,177,218,177,219,177,220,177,221,177,222,177,223,177,224,177,225,177,226,177,227,177,228,177,229,177,230,177,231,177,232,177,233,177,234,177,235,177,236,177,237,177,238,177,239,177,240,177,241,177,242,177,243,177,244,177,245,177,246,177,247,177,248,177,249,177,250,177,251,177,252,177,253,177,254,178,64,178,65,178,66,178,67,178,68,178,69,178,70,178,71,178,72,178,73,178,74,178,75,178,76,178,77,178,78,178,79,178,80,178,81,178,82,178,83,178,84,178,85,178,86,178,87,178,88,178,89,178,90,178,91,178,92,178,93,178,94,178,95,178,96,178,97,178,98,178,99,178,100,178,101,178,102,178,103,178,104,178,105,178,106,178,107,178,108,178,109,178,110,178,111,178,112,178,113,178,114,178,115,178,116,178,117,178,118,178,119,178,120,178,121,178,122,178,123,178,124,178,125,178,126,178,161,178,162,178,163,178,164,178,165,178,166,178,167,178,168,178,169,178,170,178,171,178,172,178,173,178,174,178,175,178,176,178,177,178,178,178,179,178,180,178,181,178,182,178,183,178,184,178,185,178,186,178,187,178,188,178,189,178,190,178,191,178,192,178,193,178,194,178,195,178,196,178,197,178,198,178,199,178,200,178,201,178,202,178,203,178,204,178,205,178,206,178,207,178,208,178,209,178,210,178,211,178,212,178,213,178,214,178,215,178,216,178,217,178,218,178,219,178,220,178,221,178,222,178,223,178,224,178,225,178,226,178,227,178,228,178,229,178,230,178,231,178,232,178,233,178,234,178,235,178,236,178,237,178,238,178,239,178,240,178,241,178,242,178,243,178,244,178,245,178,246,178,247,178,248,178,249,178,250,178,251,178,252,178,253,178,254,179,64,179,65,179,66,179,67,179,68,179,69,179,70,179,71,179,72,179,73,179,74,179,75,179,76,179,77,179,78,179,79,179,80,179,81,179,82,179,83,179,84,179,85,179,86,179,87,179,88,179,89,179,90,179,91,179,92,179,93,179,94,179,95,179,96,179,97,179,98,179,99,179,100,179,101,179,102,179,103,179,104,179,105,179,106,179,107,179,108,179,109,179,110,179,111,179,112,179,113,179,114,179,115,179,116,179,117,179,118,179,119,179,120,179,121,179,122,179,123,179,124,179,125,179,126,179,161,179,162,179,164,179,165,179,166,179,167,179,168,179,169,179,170,179,171,179,172,179,173,179,174,179,175,179,176,179,177,179,178,179,179,179,180,179,181,179,182,179,183,179,184,179,185,179,186,179,187,179,188,179,189,179,190,179,191,179,192,179,193,179,194,179,195,179,196,179,197,179,198,179,199,179,200,179,201,179,202,179,203,179,204,179,205,179,206,179,207,179,208,179,209,179,210,179,211,179,212,179,213,179,214,179,215,179,216,179,217,179,218,179,219,179,220,179,221,179,222,179,223,179,224,179,225,179,226,179,227,179,228,179,229,179,230,179,231,179,232,179,233,179,234,179,235,179,236,179,237,179,238,179,239,179,240,179,241,179,242,179,243,179,244,179,245,179,246,179,247,179,248,179,249,179,250,179,251,179,252,179,253,179,254,180,64,180,65,180,66,180,67,180,68,180,69,180,70,180,71,180,72,180,73,180,74,180,75,180,76,180,77,180,78,180,79,180,80,180,81,180,82,180,83,180,84,180,85,180,86,180,87,180,88,180,89,180,90,180,91,180,92,180,93,180,94,180,95,180,96,180,97,180,98,180,99,180,100,180,101,180,102,180,103,180,104,180,105,180,106,180,107,180,108,180,109,180,110,180,111,180,112,180,113,180,114,180,115,180,116,180,117,180,118,180,119,180,120,180,121,180,122,180,123,180,124,180,125,180,126,180,161,180,162,180,163,180,164,180,165,180,166,180,167,180,168,180,169,180,170,180,171,180,172,180,173,180,174,180,175,180,176,180,177,180,178,180,179,180,180,180,181,180,182,180,183,180,184,180,185,180,186,180,187,180,188,180,189,180,190,180,191,180,192,180,193,180,194,180,195,180,196,180,197,180,198,180,199,180,200,180,201,180,202,180,203,180,204,180,205,180,206,180,207,180,208,180,209,180,210,180,211,180,212,180,213,180,214,180,215,180,216,180,217,180,218,180,219,180,220,180,221,180,222,180,223,180,224,180,225,180,226,180,227,180,228,180,229,180,230,180,231,180,232,180,233,180,234,180,235,180,236,180,237,180,238,180,239,180,240,180,241,180,242,180,243,180,244,180,245,180,246,180,247,180,248,180,249,180,250,180,251,180,252,180,253,180,254,181,64,181,65,181,66,181,67,181,68,181,69,181,70,181,71,181,72,181,73,181,74,181,75,181,76,181,77,181,78,181,79,181,80,181,81,181,82,181,83,181,84,181,85,181,86,181,87,181,88,181,89,181,90,181,91,181,92,181,93,181,94,181,95,181,96,181,97,181,98,181,99,181,100,181,101,181,102,181,103,181,104,181,105,181,106,181,107,181,108,181,109,181,110,181,111,181,112,181,113,181,114,181,115,181,116,181,117,181,118,181,119,181,120,181,121,181,122,181,123,181,124,181,125,181,126,181,161,181,162,181,163,181,164,181,165,181,166,181,167,181,168,181,169,181,170,181,171,181,172,181,173,181,175,181,176,181,177,181,178,181,179,181,180,181,181,181,182,181,183,181,184,181,185,181,186,181,187,181,188,181,189,181,190,181,191,181,192,181,193,181,194,181,195,181,196,181,197,181,198,181,199,181,200,181,201,181,202,181,203,181,204,181,205,181,206,181,207,181,208,181,209,181,210,181,211,181,212,181,213,181,214,181,216,181,217,181,218,181,219,181,220,181,221,181,222,181,223,181,224,181,225,181,226,181,227,181,228,181,229,181,230,181,231,181,232,181,233,181,234,181,235,181,236,181,237,181,238,181,239,181,240,181,241,181,242,181,243,181,244,181,245,181,246,181,247,181,248,181,249,181,250,181,251,181,252,181,253,181,254,182,64,182,65,182,66,182,67,182,68,182,69,182,70,182,71,182,72,182,73,182,74,182,75,182,76,182,77,182,78,182,79,182,80,182,81,182,82,182,83,182,84,182,85,182,86,182,87,182,88,182,89,182,90,182,91,182,92,182,93,182,94,182,95,182,96,182,97,182,98,182,99,182,100,182,101,182,102,182,103,182,104,182,105,182,106,182,107,182,108,182,109,182,110,182,111,182,112,182,113,182,114,182,115,182,116,182,117,182,118,182,119,182,120,182,121,182,122,182,123,182,124,182,125,182,126,182,161,182,162,182,163,182,164,182,165,182,166,182,167,182,168,182,169,182,170,182,171,182,172,182,173,182,174,182,175,182,176,182,177,182,178,182,179,182,180,182,181,182,182,182,183,182,184,182,185,182,186,182,187,182,188,182,189,182,190,182,191,182,192,182,193,182,194,182,195,182,196,182,197,182,198,182,199,182,200,182,201,182,202,182,203,182,204,182,205,182,206,182,207,182,208,182,209,182,210,182,211,182,212,182,213,182,214,182,215,182,216,182,217,182,218,182,219,182,220,182,221,182,222,182,223,182,224,182,225,182,226,182,227,182,228,182,229,182,230,182,231,182,232,182,233,182,234,182,235,182,236,182,237,182,238,182,239,182,240,182,241,182,242,182,243,182,244,182,245,182,246,182,247,182,248,182,249,182,250,182,251,182,252,182,253,182,254,183,64,183,65,183,66,183,67,183,68,183,69,183,70,183,71,183,72,183,73,183,74,183,75,183,76,183,77,183,78,183,79,183,80,183,81,183,82,183,83,183,84,183,85,183,86,183,87,183,88,183,89,183,90,183,91,183,92,183,93,183,94,183,95,183,96,183,97,183,98,183,99,183,100,183,101,183,102,183,103,183,104,183,105,183,106,183,107,183,108,183,109,183,110,183,111,183,112,183,113,183,114,183,115,183,116,183,117,183,118,183,119,183,120,183,121,183,122,183,123,183,124,183,125,183,126,183,161,183,162,183,163,183,164,183,165,183,166,183,167,183,168,183,169,183,170,183,171,183,172,183,173,183,174,183,175,183,176,183,177,183,178,183,179,183,180,183,181,183,182,183,183,183,184,183,185,183,186,183,187,183,188,183,189,183,190,183,191,183,192,183,193,183,194,183,195,183,196,183,197,183,198,183,199,183,200,183,201,183,202,183,203,183,204,183,205,183,206,183,207,183,208,183,209,183,210,183,211,183,212,183,213,183,214,183,215,183,216,183,217,183,218,183,219,183,220,183,221,183,222,183,223,183,224,183,225,183,226,183,227,183,228,183,229,183,230,183,231,183,232,183,233,183,234,183,235,183,236,183,237,183,238,183,239,183,240,183,241,183,242,183,243,183,244,183,245,183,246,183,247,183,248,183,249,183,250,183,251,183,252,183,253,183,254,184,64,184,65,184,66,184,67,184,68,184,69,184,70,184,71,184,72,184,73,184,74,184,75,184,76,184,77,184,78,184,79,184,80,184,81,184,82,184,83,184,84,184,85,184,86,184,87,184,88,184,89,184,90,184,91,184,92,184,93,184,94,184,95,184,96,184,97,184,98,184,99,184,100,184,101,184,102,184,103,184,104,184,105,184,106,184,107,184,108,184,109,184,110,184,111,184,112,184,113,184,114,184,115,184,116,184,117,184,118,184,119,184,120,184,121,184,122,184,123,184,124,184,125,184,126,184,161,184,162,184,163,184,164,184,165,184,166,184,167,184,168,184,169,184,170,184,171,184,172,184,173,184,174,184,175,184,176,184,177,184,178,184,179,184,180,184,181,184,182,184,183,184,184,184,185,184,186,184,187,184,188,184,189,184,190,184,191,184,192,184,193,184,194,184,195,184,196,184,197,184,198,184,199,184,200,184,201,184,202,184,203,184,204,184,205,184,206,184,207,184,208,184,209,184,210,184,211,184,212,184,213,184,214,184,215,184,216,184,217,184,218,184,219,184,220,184,221,184,222,184,223,184,224,184,225,184,226,184,227,184,228,184,229,184,230,184,231,184,232,184,233,184,234,184,235,184,236,184,237,184,238,184,239,184,240,184,241,184,242,184,243,184,244,184,245,184,246,184,247,184,248,184,249,184,250,184,251,184,252,184,253,184,254,185,64,185,65,185,66,185,67,185,68,185,69,185,70,185,71,185,72,185,73,185,74,185,75,185,76,185,77,185,78,185,79,185,80,185,81,185,82,185,83,185,84,185,85,185,86,185,87,185,88,185,89,185,90,185,91,185,92,185,93,185,94,185,95,185,96,185,97,185,98,185,99,185,100,185,101,185,102,185,103,185,104,185,105,185,106,185,107,185,108,185,109,185,110,185,111,185,112,185,113,185,114,185,115,185,116,185,117,185,118,185,119,185,120,185,121,185,122,185,123,185,124,185,125,185,126,185,161,185,162,185,163,185,164,185,165,185,166,185,167,185,168,185,169,185,170,185,171,185,172,185,173,185,174,185,175,185,177,185,178,185,179,185,180,185,181,185,182,185,183,185,184,185,185,185,186,185,187,185,188,185,189,185,190,185,191,185,192,185,193,185,194,185,195,185,196,185,197,185,198,185,199,185,200,185,201,185,202,185,203,185,204,185,205,185,206,185,207,185,208,185,209,185,210,185,211,185,212,185,213,185,214,185,215,185,216,185,217,185,218,185,219,185,220,185,221,185,222,185,223,185,224,185,225,185,226,185,227,185,228,185,229,185,230,185,231,185,232,185,233,185,234,185,235,185,236,185,237,185,238,185,239,185,240,185,241,185,242,185,243,185,244,185,245,185,246,185,247,185,248,185,249,185,250,185,251,185,252,185,253,185,254,186,64,186,65,186,66,186,67,186,68,186,69,186,70,186,71,186,72,186,73,186,74,186,75,186,76,186,77,186,78,186,79,186,80,186,81,186,82,186,83,186,84,186,85,186,86,186,87,186,88,186,89,186,90,186,91,186,92,186,93,186,94,186,95,186,96,186,97,186,98,186,99,186,100,186,101,186,102,186,103,186,104,186,105,186,106,186,107,186,108,186,109,186,110,186,111,186,112,186,113,186,114,186,115,186,116,186,117,186,118,186,119,186,120,186,121,186,122,186,123,186,124,186,125,186,126,186,161,186,162,186,163,186,164,186,165,186,166,186,167,186,168,186,169,186,170,186,171,186,172,186,173,186,174,186,175,186,176,186,177,186,178,186,179,186,180,186,181,186,182,186,183,186,184,186,185,186,186,186,187,186,188,186,189,186,190,186,191,186,192,186,193,186,194,186,195,186,196,186,197,186,198,186,199,186,200,186,201,186,202,186,203,186,204,186,205,186,206,186,207,186,208,186,209,186,210,186,211,186,212,186,213,186,214,186,215,186,216,186,217,186,218,186,219,186,220,186,221,186,222,186,223,186,224,186,225,186,226,186,227,186,228,186,229,186,231,186,232,186,233,186,234,186,235,186,236,186,237,186,238,186,239,186,240,186,241,186,242,186,243,186,244,186,245,186,246,186,247,186,248,186,249,186,250,186,251,186,253,186,254,187,64,187,65,187,66,187,67,187,68,187,69,187,70,187,71,187,72,187,73,187,74,187,75,187,76,187,77,187,78,187,79,187,80,187,81,187,82,187,83,187,84,187,85,187,86,187,87,187,88,187,89,187,90,187,91,187,92,187,93,187,94,187,95,187,96,187,97,187,98,187,99,187,100,187,101,187,102,187,103,187,104,187,105,187,106,187,107,187,108,187,109,187,110,187,111,187,112,187,113,187,114,187,115,187,116,187,117,187,118,187,119,187,120,187,121,187,122,187,123,187,124,187,125,187,126,187,161,187,162,187,163,187,164,187,165,187,166,187,167,187,168,187,169,187,170,187,171,187,172,187,173,187,174,187,175,187,176,187,177,187,178,187,179,187,180,187,181,187,182,187,183,187,184,187,185,187,186,187,187,187,188,187,189,187,190,187,191,187,192,187,193,187,194,187,195,187,196,187,197,187,198,187,199,187,200,187,201,187,202,187,203,187,204,187,205,187,206,187,207,187,208,187,209,187,210,187,211,187,212,187,213,187,214,187,215,187,216,187,217,187,218,187,219,187,220,187,221,187,222,187,223,187,224,187,225,187,226,187,227,187,228,187,229,187,230,187,231,187,232,187,233,187,234,187,235,187,236,187,237,187,238,187,239,187,240,187,241,187,242,187,243,187,244,187,245,187,246,187,247,187,248,187,249,187,250,187,251,187,252,187,253,187,254,188,64,188,65,188,66,188,67,188,68,188,69,188,70,188,71,188,72,188,73,188,74,188,75,188,76,188,77,188,78,188,79,188,80,188,81,188,82,188,83,188,84,188,85,188,86,188,87,188,88,188,89,188,90,188,91,188,92,188,93,188,94,188,95,188,96,188,97,188,98,188,99,188,100,188,101,188,102,188,103,188,104,188,105,188,106,188,107,188,108,188,109,188,110,188,111,188,112,188,113,188,114,188,115,188,116,188,117,188,118,188,119,188,120,188,121,188,122,188,123,188,124,188,125,188,126,188,161,188,162,188,163,188,164,188,165,188,166,188,167,188,168,188,169,188,170,188,171,188,172,188,173,188,174,188,175,188,176,188,177,188,178,188,179,188,180,188,181,188,182,188,183,188,184,188,185,188,186,188,187,188,188,188,189,188,190,188,191,188,192,188,193,188,194,188,195,188,196,188,197,188,198,188,199,188,200,188,201,188,202,188,203,188,204,188,205,188,206,188,207,188,208,188,209,188,210,188,211,188,212,188,213,188,214,188,215,188,216,188,217,188,218,188,219,188,220,188,221,188,222,188,223,188,224,188,225,188,226,188,227,188,228,188,229,188,230,188,231,188,232,188,233,188,234,188,235,188,236,188,237,188,238,188,239,188,240,188,241,188,242,188,243,188,244,188,245,188,246,188,247,188,248,188,249,188,250,188,251,188,252,188,253,188,254,189,64,189,65,189,66,189,67,189,68,189,69,189,70,189,71,189,72,189,73,189,74,189,75,189,76,189,77,189,78,189,79,189,80,189,81,189,82,189,83,189,84,189,85,189,86,189,87,189,88,189,89,189,90,189,91,189,92,189,93,189,94,189,95,189,96,189,97,189,98,189,99,189,100,189,101,189,102,189,103,189,104,189,105,189,106,189,107,189,108,189,109,189,110,189,111,189,112,189,113,189,114,189,115,189,116,189,117,189,118,189,119,189,120,189,121,189,122,189,123,189,124,189,125,189,126,189,161,189,162,189,163,189,164,189,165,189,166,189,167,189,168,189,169,189,170,189,171,189,172,189,173,189,174,189,175,189,176,189,177,189,178,189,179,189,180,189,181,189,182,189,183,189,184,189,185,189,186,189,187,189,188,189,189,189,190,189,191,189,192,189,193,189,194,189,195,189,196,189,197,189,198,189,199,189,200,189,201,189,202,189,203,189,204,189,205,189,206,189,207,189,208,189,209,189,210,189,211,189,212,189,213,189,214,189,215,189,216,189,217,189,218,189,219,189,220,189,221,189,222,189,223,189,224,189,225,189,226,189,227,189,228,189,229,189,230,189,231,189,232,189,233,189,234,189,235,189,236,189,237,189,238,189,239,189,240,189,241,189,242,189,243,189,244,189,245,189,246,189,247,189,248,189,249,189,250,189,251,189,252,189,253,189,254,190,64,190,65,190,66,190,67,190,68,190,69,190,70,190,71,190,72,190,73,190,74,190,75,190,76,190,77,190,78,190,79,190,80,190,81,190,82,190,83,190,84,190,85,190,86,190,87,190,88,190,89,190,90,190,91,190,92,190,93,190,94,190,95,190,96,190,97,190,98,190,99,190,100,190,101,190,102,190,103,190,104,190,105,190,106,190,107,190,108,190,109,190,110,190,111,190,112,190,113,190,114,190,115,190,116,190,117,190,118,190,119,190,120,190,121,190,122,190,123,190,124,190,125,190,126,190,161,190,162,190,163,190,164,190,165,190,166,190,167,190,168,190,169,190,170,190,171,190,172,190,173,190,174,190,175,190,176,190,177,190,178,190,179,190,180,190,181,190,182,190,183,190,184,190,185,190,186,190,187,190,188,190,189,190,190,190,191,190,192,190,193,190,194,190,195,190,196,190,197,190,198,190,199,190,200,190,201,190,202,190,203,190,204,190,205,190,206,190,207,190,208,190,209,190,210,190,211,190,212,190,213,190,214,190,215,190,216,190,217,190,218,190,219,190,220,190,221,190,222,190,223,190,224,190,225,190,226,190,227,190,228,190,229,190,230,190,231,190,232,190,233,190,234,190,235,190,236,190,237,190,238,190,239,190,240,190,241,190,242,190,243,190,244,190,245,190,246,190,247,190,248,190,249,190,250,190,251,190,252,190,253,190,254,191,64,191,65,191,66,191,67,191,68,191,69,191,70,191,72,191,73,191,74,191,75,191,76,191,77,191,78,191,79,191,80,191,81,191,82,191,83,191,84,191,85,191,86,191,87,191,88,191,89,191,90,191,91,191,92,191,93,191,94,191,95,191,96,191,97,191,98,191,99,191,100,191,101,191,102,191,103,191,104,191,105,191,106,191,107,191,108,191,109,191,110,191,111,191,112,191,113,191,114,191,115,191,116,191,117,191,118,191,119,191,120,191,121,191,122,191,123,191,124,191,125,191,126,191,161,191,162,191,163,191,164,191,165,191,167,191,168,191,169,191,170,191,171,191,172,191,173,191,175,191,176,191,177,191,178,191,179,191,180,191,181,191,182,191,183,191,184,191,185,191,186,191,187,191,188,191,189,191,190,191,191,191,192,191,193,191,194,191,195,191,196,191,197,191,198,191,199,191,200,191,201,191,202,191,203,191,205,191,206,191,207,191,208,191,209,191,210,191,211,191,212,191,213,191,214,191,215,191,216,191,217,191,218,191,219,191,220,191,221,191,222,191,223,191,224,191,225,191,226,191,227,191,228,191,229,191,230,191,231,191,232,191,233,191,234,191,235,191,236,191,237,191,238,191,239,191,240,191,241,191,242,191,243,191,244,191,245,191,246,191,247,191,248,191,249,191,250,191,251,191,252,191,253,191,254,192,64,192,65,192,66,192,67,192,68,192,69,192,70,192,71,192,72,192,73,192,74,192,75,192,76,192,77,192,78,192,79,192,80,192,81,192,83,192,84,192,85,192,86,192,87,192,88,192,89,192,90,192,91,192,92,192,93,192,94,192,95,192,96,192,97,192,98,192,99,192,100,192,101,192,102,192,103,192,104,192,105,192,106,192,107,192,108,192,109,192,110,192,111,192,112,192,113,192,114,192,115,192,116,192,117,192,118,192,119,192,120,192,121,192,122,192,123,192,124,192,125,192,126,192,161,192,162,192,163,192,164,192,165,192,166,192,167,192,168,192,169,192,170,192,171,192,172,192,173,192,174,192,175,192,176,192,177,192,178,192,179,192,180,192,181,192,182,192,183,192,184,192,185,192,186,192,187,192,188,192,189,192,190,192,191,192,192,192,193,192,194,192,195,192,196,192,197,192,198,192,199,192,200,192,201,192,202,192,203,192,204,192,205,192,206,192,207,192,208,192,209,192,210,192,211,192,212,192,213,192,214,192,215,192,216,192,217,192,218,192,219,192,220,192,221,192,222,192,223,192,224,192,225,192,226,192,227,192,228,192,229,192,230,192,232,192,233,192,234,192,235,192,236,192,237,192,238,192,239,192,240,192,241,192,242,192,243,192,244,192,245,192,246,192,247,192,248,192,249,192,250,192,251,192,252,192,253,192,254,193,64,193,65,193,66,193,67,193,68,193,69,193,70,193,71,193,72,193,73,193,74,193,75,193,76,193,77,193,78,193,79,193,80,193,81,193,82,193,83,193,84,193,85,193,86,193,87,193,88,193,89,193,90,193,91,193,92,193,93,193,94,193,95,193,96,193,97,193,98,193,99,193,100,193,101,193,102,193,103,193,104,193,105,193,106,193,107,193,108,193,109,193,110,193,111,193,112,193,113,193,114,193,115,193,116,193,117,193,118,193,119,193,120,193,121,193,122,193,123,193,124,193,125,193,126,193,161,193,162,193,163,193,164,193,165,193,166,193,167,193,168,193,169,193,170,193,171,193,172,193,173,193,174,193,175,193,176,193,177,193,178,193,179,193,180,193,181,193,182,193,183,193,184,193,185,193,186,193,187,193,188,193,189,193,190,193,191,193,192,193,193,193,194,193,195,193,196,193,197,193,198,193,199,193,200,193,201,193,202,193,203,193,204,193,205,193,206,193,207,193,208,193,209,193,210,193,211,193,212,193,213,193,214,193,215,193,216,193,217,193,218,193,219,193,220,193,221,193,222,193,223,193,224,193,225,193,226,193,227,193,228,193,229,193,230,193,231,193,232,193,233,193,234,193,235,193,236,193,237,193,238,193,239,193,240,193,241,193,242,193,243,193,244,193,245,193,246,193,247,193,248,193,249,193,250,193,251,193,252,193,253,193,254,194,64,194,65,194,66,194,67,194,68,194,69,194,70,194,71,194,72,194,73,194,74,194,75,194,76,194,77,194,78,194,79,194,80,194,81,194,82,194,83,194,84,194,85,194,86,194,87,194,88,194,89,194,90,194,91,194,92,194,93,194,94,194,95,194,96,194,97,194,98,194,99,194,100,194,101,194,102,194,103,194,104,194,105,194,106,194,107,194,108,194,109,194,110,194,111,194,112,194,113,194,114,194,115,194,116,194,117,194,118,194,119,194,120,194,121,194,122,194,123,194,124,194,125,194,126,194,161,194,162,194,163,194,164,194,165,194,166,194,167,194,168,194,169,194,170,194,171,194,172,194,173,194,174,194,175,194,176,194,177,194,178,194,179,194,180,194,181,194,182,194,183,194,184,194,185,194,186,194,187,194,188,194,189,194,190,194,191,194,192,194,193,194,194,194,195,194,196,194,197,194,198,194,199,194,200,194,201,194,202,194,203,194,204,194,205,194,206,194,207,194,208,194,209,194,210,194,211,194,212,194,213,194,214,194,215,194,216,194,217,194,218,194,219,194,220,194,221,194,222,194,223,194,224,194,225,194,226,194,227,194,228,194,229,194,230,194,231,194,232,194,233,194,234,194,235,194,236,194,237,194,238,194,239,194,240,194,241,194,242,194,243,194,244,194,245,194,246,194,247,194,248,194,249,194,250,194,251,194,252,194,253,194,254,195,64,195,65,195,66,195,67,195,68,195,69,195,70,195,71,195,72,195,73,195,74,195,75,195,76,195,77,195,78,195,79,195,80,195,81,195,82,195,83,195,84,195,85,195,86,195,87,195,88,195,89,195,90,195,91,195,92,195,93,195,94,195,95,195,96,195,97,195,98,195,99,195,100,195,101,195,102,195,103,195,104,195,105,195,106,195,107,195,108,195,109,195,110,195,111,195,112,195,113,195,114,195,115,195,116,195,117,195,118,195,119,195,120,195,121,195,122,195,123,195,124,195,125,195,126,195,161,195,162,195,163,195,164,195,165,195,166,195,167,195,168,195,169,195,170,195,171,195,172,195,173,195,174,195,175,195,176,195,177,195,178,195,179,195,180,195,181,195,182,195,183,195,184,195,185,195,186,195,187,195,188,195,189,195,190,195,191,195,192,195,193,195,194,195,195,195,196,195,197,195,198,195,199,195,200,195,201,195,202,195,203,195,204,195,205,195,206,195,207,195,208,195,209,195,210,195,211,195,212,195,213,195,214,195,215,195,216,195,217,195,218,195,219,195,220,195,221,195,222,195,223,195,224,195,225,195,226,195,227,195,228,195,229,195,230,195,231,195,232,195,233,195,234,195,235,195,236,195,237,195,238,195,239,195,240,195,241,195,242,195,243,195,244,195,245,195,246,195,247,195,248,195,249,195,250,195,251,195,252,195,253,195,254,196,64,196,65,196,66,196,67,196,68,196,69,196,70,196,71,196,72,196,73,196,74,196,75,196,76,196,77,196,78,196,79,196,80,196,81,196,82,196,83,196,84,196,85,196,86,196,87,196,88,196,89,196,90,196,91,196,92,196,93,196,94,196,95,196,96,196,97,196,98,196,99,196,100,196,101,196,102,196,103,196,104,196,105,196,106,196,107,196,108,196,109,196,110,196,111,196,112,196,113,196,114,196,115,196,116,196,117,196,118,196,119,196,120,196,121,196,122,196,123,196,124,196,125,196,126,196,161,196,162,196,163,196,164,196,165,196,166,196,167,196,168,196,169,196,170,196,171,196,172,196,173,196,174,196,175,196,176,196,177,196,178,196,179,196,180,196,181,196,182,196,183,196,184,196,185,196,186,196,187,196,188,196,189,196,190,196,191,196,192,196,193,196,194,196,195,196,196,196,197,196,198,196,199,196,200,196,201,196,202,196,203,196,204,196,205,196,206,196,207,196,208,196,209,196,210,196,211,196,212,196,213,196,214,196,215,196,216,196,217,196,218,196,219,196,220,196,221,196,222,196,223,196,224,196,225,196,226,196,227,196,228,196,229,196,230,196,231,196,232,196,233,196,234,196,235,196,236,196,237,196,238,196,239,196,240,196,241,196,242,196,243,196,244,196,245,196,246,196,247,196,248,196,249,196,250,196,251,196,252,196,253,196,254,197,64,197,65,197,66,197,67,197,68,197,69,197,70,197,71,197,72,197,73,197,74,197,75,197,76,197,77,197,78,197,79,197,80,197,81,197,82,197,83,197,85,197,86,197,87,197,88,197,89,197,90,197,91,197,92,197,93,197,94,197,95,197,96,197,97,197,98,197,99,197,100,197,101,197,102,197,103,197,104,197,105,197,106,197,107,197,108,197,109,197,110,197,111,197,112,197,113,197,114,197,115,197,116,197,117,197,118,197,119,197,120,197,121,197,122,197,123,197,124,197,125,197,126,197,161,197,162,197,163,197,164,197,165,197,166,197,167,197,168,197,169,197,170,197,171,197,172,197,173,197,174,197,175,197,176,197,177,197,178,197,179,197,180,197,181,197,182,197,183,197,184,197,185,197,186,197,187,197,188,197,189,197,190,197,191,197,192,197,193,197,194,197,195,197,196,197,197,197,198,197,199,197,200,197,201,197,202,197,203,197,204,197,205,197,206,197,207,197,208,197,209,197,210,197,211,197,212,197,213,197,214,197,215,197,216,197,217,197,218,197,219,197,220,197,221,197,222,197,223,197,224,197,225,197,226,197,227,197,228,197,229,197,230,197,231,197,232,197,233,197,234,197,235,197,236,197,237,197,238,197,239,197,240,197,241,197,242,197,243,197,244,197,245,197,246,197,248,197,249,197,250,197,251,197,252,197,253,197,254,198,64,198,65,198,66,198,67,198,68,198,69,198,70,198,71,198,72,198,73,198,74,198,75,198,76,198,77,198,78,198,79,198,80,198,81,198,82,198,83,198,84,198,85,198,86,198,87,198,88,198,89,198,90,198,91,198,92,198,93,198,94,198,95,198,96,198,97,198,98,198,99,198,100,198,101,198,102,198,103,198,104,198,105,198,106,198,107,198,108,198,109,198,110,198,111,198,112,198,113,198,114,198,115,198,116,198,117,198,118,198,119,198,120,198,121,198,122,198,123,198,124,198,125,198,126,161,178,201,64,201,65,201,66,201,67,201,68,201,69,201,70,201,71,201,72,201,73,201,74,201,75,201,76,201,77,201,78,201,79,201,80,201,81,201,82,201,83,201,84,201,85,201,86,201,87,201,88,201,89,201,90,201,91,201,93,201,94,201,95,201,96,201,97,201,98,201,99,201,100,201,101,201,102,201,103,201,104,201,106,201,107,201,108,201,109,201,110,201,111,201,112,201,113,201,114,201,115,201,116,201,117,201,118,201,119,201,120,201,121,201,122,201,123,201,124,201,125,201,126,201,161,201,162,201,163,201,164,201,165,201,166,201,167,201,168,201,169,201,170,201,171,201,172,201,173,201,174,201,175,201,176,201,177,201,178,201,179,201,180,201,181,201,182,201,183,201,184,201,185,201,186,201,187,201,188,201,189,201,190,201,191,201,192,201,193,201,194,201,195,201,196,201,197,201,198,201,199,201,200,201,201,201,202,201,203,201,204,201,205,201,206,201,207,201,208,201,209,201,210,201,211,201,212,201,213,201,214,201,215,201,216,201,217,201,218,201,219,201,220,201,221,201,222,201,223,201,224,201,225,201,226,201,227,201,228,201,229,201,230,201,231,201,232,201,233,201,234,201,235,201,236,201,237,201,238,201,239,201,240,201,241,201,242,201,243,201,244,201,245,201,246,201,247,201,248,201,249,201,250,201,251,201,253,201,254,202,64,202,65,202,66,202,67,202,68,202,69,202,70,202,71,202,72,202,73,202,74,202,75,202,76,202,77,202,78,202,79,202,80,202,81,202,83,202,84,202,85,202,86,202,87,202,88,202,89,202,90,202,91,202,92,202,93,202,94,202,95,202,96,202,97,202,98,202,99,202,100,202,101,202,102,202,103,202,104,202,105,202,106,202,107,202,108,202,109,202,110,202,111,202,112,202,113,202,114,202,115,202,116,202,117,202,118,202,119,202,120,202,121,202,122,202,123,202,124,202,125,202,126,202,161,202,162,202,163,202,164,202,165,202,166,202,167,202,168,202,169,202,170,202,171,202,172,202,173,202,174,202,175,202,176,202,177,202,178,202,179,202,180,202,181,202,182,202,183,202,184,202,185,202,186,202,187,202,188,202,189,202,190,202,191,202,192,202,193,202,194,202,195,202,196,202,197,202,198,202,199,202,200,202,201,202,202,202,203,202,204,202,205,202,206,202,207,202,208,202,209,202,210,202,211,202,212,202,213,202,214,202,215,202,216,202,217,202,218,202,219,202,220,202,221,202,222,202,223,202,224,202,225,202,226,202,227,202,228,202,229,202,230,202,231,202,232,202,233,202,234,202,235,202,236,202,237,202,238,202,239,202,240,202,241,202,242,202,243,202,244,202,245,202,246,202,247,202,248,202,249,202,250,202,251,202,252,202,253,202,254,203,64,203,65,203,66,203,67,203,68,203,69,203,70,203,71,203,72,203,73,203,74,203,75,203,76,203,77,203,78,203,79,203,80,203,81,203,82,203,83,203,84,203,85,203,86,203,87,203,88,203,89,203,90,203,91,203,92,203,93,203,94,203,95,203,96,203,97,203,98,203,99,203,100,203,101,203,102,203,103,203,104,203,105,203,106,203,107,203,108,203,109,203,110,203,111,203,112,203,113,203,114,203,115,203,116,203,117,203,118,203,119,203,120,203,121,203,122,203,123,203,124,203,125,203,126,203,161,203,162,203,163,203,164,203,165,203,166,203,167,203,168,203,169,203,170,203,171,203,172,203,173,203,174,203,175,203,176,203,177,203,178,203,179,203,180,203,181,203,182,203,183,203,184,203,185,203,186,203,187,203,188,203,189,203,190,203,191,203,192,203,193,203,194,203,195,203,196,203,197,203,198,203,199,203,200,203,201,203,202,203,203,203,204,203,205,203,206,203,207,203,208,203,209,203,210,203,211,203,212,203,213,203,214,203,215,203,216,203,217,203,218,203,219,203,220,203,221,203,222,203,223,203,224,203,225,203,226,203,227,203,228,203,229,203,230,203,231,203,232,203,233,203,234,203,235,203,236,203,237,203,238,203,239,203,240,203,241,203,242,203,243,203,244,203,245,203,246,203,247,203,248,203,249,203,250,203,251,203,252,203,253,203,254,204,64,204,65,204,66,204,67,204,68,204,69,204,70,204,71,204,72,204,73,204,74,204,75,204,76,204,77,204,78,204,79,204,80,204,81,204,82,204,83,204,84,204,85,204,86,204,87,204,88,204,89,204,90,204,91,204,92,204,93,204,94,204,95,204,96,204,97,204,98,204,99,204,100,204,101,204,102,204,103,204,104,204,105,204,106,204,107,204,108,204,109,204,110,204,111,204,112,204,113,204,114,204,115,204,116,204,117,204,118,204,119,204,120,204,121,204,122,204,123,204,124,204,125,204,126,204,161,204,162,204,163,204,164,204,165,204,166,204,167,204,168,204,169,204,170,204,171,204,172,204,173,204,174,204,175,204,176,204,177,204,178,204,179,204,180,204,181,204,182,204,183,204,184,204,185,204,186,204,187,204,188,204,189,204,190,204,191,204,192,204,193,204,194,204,195,204,196,204,197,204,198,204,199,204,200,204,201,204,202,204,203,204,204,204,205,204,206,204,207,204,208,204,209,204,210,204,211,204,212,204,213,204,214,204,215,204,216,204,217,204,218,204,219,204,220,204,221,204,222,204,223,204,224,204,225,204,226,204,227,204,228,204,229,204,230,204,231,204,232,204,233,204,234,204,235,204,236,204,237,204,238,204,239,204,240,204,241,204,242,204,243,204,244,204,245,204,246,204,247,204,248,204,249,204,250,204,251,204,252,204,253,204,254,205,64,205,65,205,66,205,67,205,68,205,69,205,70,205,71,205,72,205,73,205,74,205,75,205,76,205,77,205,78,205,79,205,80,205,81,205,82,205,83,205,84,205,85,205,86,205,87,205,88,205,89,205,90,205,91,205,92,205,93,205,94,205,95,205,96,205,97,205,98,205,99,205,100,205,101,205,102,205,103,205,104,205,105,205,106,205,107,205,108,205,109,205,110,205,111,205,112,205,113,205,114,205,115,205,116,205,117,205,118,205,119,205,120,205,121,205,122,205,123,205,124,205,125,205,126,205,161,205,162,205,163,205,164,205,165,205,166,205,167,205,168,205,169,205,170,205,171,205,172,205,173,205,174,205,175,205,176,205,177,205,178,205,179,205,180,205,181,205,182,205,183,205,184,205,185,205,186,205,187,205,188,205,189,205,190,205,191,205,192,205,193,205,194,205,195,205,196,205,197,205,198,205,199,205,200,205,201,205,202,205,203,205,204,205,205,205,206,205,207,205,208,205,209,205,210,205,211,205,212,205,213,205,214,205,215,205,216,205,217,205,218,205,219,205,220,205,221,205,222,205,223,205,224,205,225,205,226,205,227,205,228,205,229,205,230,205,232,205,233,205,234,205,235,205,236,205,237,205,238,205,239,205,240,205,241,205,242,205,243,205,244,205,245,205,246,205,247,205,248,205,249,205,250,205,251,205,252,205,253,205,254,206,64,206,65,206,66,206,67,206,68,206,69,206,70,206,71,206,72,206,73,206,74,206,75,206,76,206,77,206,78,206,79,206,80,206,81,206,82,206,83,206,84,206,85,206,86,206,87,206,88,206,89,206,90,206,91,206,92,206,93,206,94,206,95,206,96,206,97,206,98,206,99,206,100,206,101,206,102,206,103,206,104,206,105,206,106,206,107,206,108,206,109,206,110,206,111,206,112,206,113,206,114,206,115,206,116,206,117,206,118,206,119,206,120,206,121,206,122,206,123,206,124,206,125,206,126,206,161,206,162,206,163,206,164,206,165,206,166,206,167,206,168,206,169,206,170,206,171,206,172,206,173,206,174,206,175,206,176,206,177,206,178,206,179,206,180,206,181,206,182,206,183,206,184,206,185,206,186,206,187,206,188,206,189,206,190,206,191,206,192,206,193,206,194,206,195,206,196,206,197,206,198,206,199,206,200,206,201,206,202,206,203,206,204,206,205,206,206,206,207,206,208,206,209,206,210,206,211,206,212,206,213,206,214,206,215,206,216,206,217,206,218,206,219,206,220,206,221,206,222,206,223,206,224,206,225,206,226,206,227,206,228,206,229,206,230,206,231,206,232,206,233,206,234,206,235,206,236,206,237,206,238,206,239,206,240,206,241,206,242,206,243,206,244,206,245,206,246,206,247,206,248,206,249,206,250,206,251,206,252,206,253,206,254,207,64,207,65,207,66,207,67,207,68,207,69,207,70,207,71,207,72,207,73,207,74,207,75,207,76,207,77,207,78,207,79,207,80,207,81,207,82,207,83,207,84,207,85,207,86,207,87,207,88,207,89,207,90,207,91,207,92,207,93,207,94,207,95,207,96,207,97,207,98,207,99,207,100,207,101,207,102,207,103,207,104,207,105,207,106,207,107,207,108,207,109,207,110,207,111,207,112,207,113,207,114,207,115,207,116,207,117,207,118,207,119,207,120,207,121,207,122,207,123,207,124,207,125,207,126,207,161,207,162,207,163,207,164,207,165,207,166,207,167,207,168,207,169,207,170,207,171,207,172,207,173,207,174,207,175,207,176,207,177,207,178,207,179,207,180,207,181,207,182,207,183,207,184,207,185,207,186,207,187,207,188,207,189,207,190,207,191,207,192,207,193,207,194,207,195,207,196,207,197,207,198,207,199,207,200,207,201,207,202,207,203,207,204,207,205,207,206,207,207,207,208,207,209,207,210,207,211,207,212,207,213,207,214,207,215,207,216,207,217,207,218,207,219,207,220,207,221,207,222,207,223,207,224,207,225,207,226,207,227,207,228,207,229,207,230,207,231,207,232,207,233,207,234,207,235,207,236,207,237,207,238,207,239,207,240,207,241,207,242,207,243,207,244,207,245,207,246,207,247,207,248,207,249,207,250,207,251,207,252,207,253,207,254,208,64,208,65,208,66,208,67,208,68,208,69,208,70,208,71,208,72,208,73,208,74,208,75,208,76,208,77,208,78,208,79,208,80,208,81,208,82,208,83,208,84,208,85,208,86,208,87,208,88,208,89,208,90,208,91,208,92,208,93,208,94,208,95,208,96,208,97,208,98,208,99,208,100,208,101,208,102,208,103,208,104,208,105,208,106,208,107,208,108,208,109,208,110,208,111,208,112,208,113,208,114,208,115,208,116,208,117,208,118,208,119,208,120,208,121,208,122,208,123,208,124,208,125,208,126,208,161,208,162,208,163,208,164,208,165,208,166,208,167,208,168,208,169,208,170,208,171,208,172,208,173,208,174,208,175,208,176,208,177,208,178,208,179,208,180,208,181,208,182,208,183,208,184,208,185,208,186,208,187,208,188,208,189,208,190,208,191,208,193,208,194,208,195,208,196,208,197,208,198,208,199,208,200,208,201,208,202,208,203,208,204,208,205,208,206,208,207,208,208,208,209,208,210,208,211,208,212,208,213,208,214,208,215,208,216,208,217,208,218,208,219,208,220,208,221,208,222,208,223,208,224,208,225,208,226,208,227,208,228,208,229,208,230,208,231,208,232,208,233,208,234,208,235,208,236,208,237,208,238,208,239,208,240,208,241,208,242,208,243,208,244,208,245,208,246,208,247,208,248,208,249,208,250,208,251,208,252,208,253,208,254,209,64,209,65,209,66,209,67,209,68,209,69,209,70,209,71,209,72,209,73,209,74,209,75,209,76,209,77,209,78,209,79,209,80,209,81,209,82,209,83,209,84,209,85,209,86,209,87,209,88,209,89,209,90,209,91,209,92,209,93,209,94,209,95,209,96,209,97,209,98,209,99,209,100,209,101,209,102,209,103,209,104,209,105,209,106,209,107,209,108,209,109,209,110,209,111,209,112,209,113,209,114,209,115,209,116,209,117,209,118,209,119,209,120,209,121,209,122,209,123,209,124,209,125,209,126,209,161,209,162,209,163,209,164,209,165,209,166,209,167,209,168,209,169,209,170,209,171,209,172,209,173,209,174,209,175,209,176,209,177,209,178,209,179,209,180,209,181,209,182,209,183,209,184,209,185,209,186,209,187,209,188,209,189,209,190,209,191,209,192,209,193,209,194,209,195,209,196,209,197,209,198,209,199,209,200,209,201,209,202,209,203,209,204,209,205,209,206,209,207,209,208,209,209,209,210,209,211,209,212,209,213,209,214,209,215,209,216,209,217,209,218,209,219,209,220,209,221,209,222,209,223,209,224,209,225,209,226,209,227,209,228,209,229,209,230,209,231,209,232,209,233,209,234,209,235,209,236,209,237,209,238,209,239,209,240,209,241,209,242,209,243,209,244,209,245,209,246,209,247,209,248,209,249,209,250,209,251,209,252,209,253,209,254,210,64,210,65,210,66,210,67,210,68,210,69,210,70,210,71,210,72,210,73,210,74,210,75,210,76,210,77,210,78,210,79,210,80,210,81,210,82,210,83,210,84,210,85,210,87,210,88,210,89,210,90,210,91,210,92,210,93,210,94,210,95,210,96,210,97,210,98,210,99,210,100,210,101,210,102,210,103,210,104,210,105,210,106,210,107,210,108,210,109,210,110,210,111,210,112,210,113,210,114,210,115,210,116,210,117,210,118,210,119,210,120,210,121,210,122,210,123,210,124,210,125,210,126,210,161,210,162,210,163,210,164,210,165,210,166,210,167,210,168,210,169,210,170,210,171,210,172,210,173,210,174,210,175,210,176,210,177,210,178,210,179,210,180,210,181,210,182,210,183,210,184,210,185,210,186,210,187,210,188,210,189,210,190,210,191,210,192,210,193,210,194,210,195,210,196,210,197,210,198,210,199,210,200,210,201,210,202,210,203,210,204,210,205,210,206,210,207,210,208,210,209,210,210,210,211,210,212,210,213,210,214,210,215,210,216,210,217,210,218,210,219,210,220,210,221,210,222,210,223,210,224,210,225,210,226,210,227,210,228,210,229,210,230,210,231,210,232,210,233,210,234,210,235,210,236,210,237,210,238,210,239,210,240,210,241,210,242,210,243,210,244,210,245,210,246,210,247,210,248,210,249,210,250,210,251,210,252,210,253,210,254,211,64,211,65,211,66,211,67,211,68,211,69,211,70,211,71,211,72,211,73,211,74,211,75,211,76,211,77,211,78,211,79,211,80,211,81,211,82,211,83,211,84,211,85,211,86,211,87,211,88,211,89,211,90,211,91,211,92,211,93,211,94,211,95,211,96,211,97,211,98,211,99,211,100,211,101,211,102,211,103,211,104,211,105,211,106,211,107,211,108,211,109,211,110,211,111,211,112,211,113,211,114,211,115,211,116,211,117,211,118,211,119,211,120,211,121,211,122,211,123,211,124,211,125,211,126,211,161,211,162,211,163,211,164,211,165,211,166,211,167,211,168,211,169,211,170,211,171,211,172,211,173,211,174,211,175,211,176,211,177,211,178,211,179,211,180,211,181,211,182,211,183,211,184,211,185,211,186,211,187,211,188,211,189,211,190,211,191,211,192,211,193,211,194,211,195,211,196,211,197,211,198,211,199,211,200,211,201,211,202,211,203,211,204,211,205,211,206,211,207,211,208,211,209,211,210,211,211,211,212,211,213,211,214,211,215,211,216,211,217,211,218,211,219,211,220,211,221,211,222,211,223,211,224,211,225,211,226,211,227,211,228,211,229,211,230,211,231,211,232,211,233,211,234,211,235,211,236,211,237,211,238,211,239,211,240,211,241,211,242,211,243,211,244,211,245,211,246,211,247,211,248,211,249,211,250,211,251,211,252,211,253,211,254,212,64,212,65,212,66,212,67,212,68,212,69,212,70,212,71,212,72,212,73,212,74,212,75,212,76,212,77,212,78,212,79,212,80,212,81,212,82,212,83,212,84,212,85,212,86,212,87,212,88,212,89,212,90,212,91,212,92,212,93,212,94,212,95,212,96,212,97,212,98,212,99,212,100,212,101,212,102,212,103,212,104,212,105,212,106,212,107,212,108,212,109,212,110,212,111,212,112,212,113,212,114,212,115,212,116,212,117,212,118,212,119,212,120,212,121,212,122,212,123,212,124,212,125,212,126,212,161,212,162,212,163,212,164,212,165,212,166,212,167,212,168,212,169,212,170,212,171,212,172,212,173,212,174,212,175,212,176,212,177,212,178,212,179,212,180,212,181,212,182,212,183,212,184,212,185,212,186,212,187,212,188,212,189,212,190,212,191,212,192,212,193,212,194,212,195,212,196,212,197,212,198,212,199,212,200,212,201,212,202,212,203,212,204,212,205,212,206,212,207,212,208,212,210,212,211,212,212,212,213,212,214,212,215,212,216,212,217,212,218,212,219,212,220,212,221,212,222,212,223,212,224,212,225,212,226,212,227,212,228,212,229,212,230,212,231,212,232,212,233,212,234,212,235,212,236,212,237,212,238,212,239,212,240,212,241,212,242,212,243,212,244,212,245,212,246,212,247,212,248,212,249,212,250,212,251,212,252,212,253,212,254,213,64,213,65,213,66,213,67,213,68,213,69,213,70,213,71,213,72,213,73,213,74,213,75,213,76,213,77,213,78,213,79,213,80,213,81,213,82,213,83,213,84,213,85,213,86,213,87,213,88,213,89,213,90,213,91,213,92,213,93,213,94,213,95,213,96,213,97,213,98,213,99,213,100,213,101,213,102,213,103,213,104,213,105,213,106,213,107,213,108,213,109,213,110,213,111,213,112,213,113,213,114,213,115,213,116,213,117,213,118,213,119,213,120,213,121,213,122,213,123,213,124,213,125,213,126,213,161,213,162,213,163,213,164,213,165,213,166,213,167,213,168,213,169,213,170,213,171,213,172,213,173,213,174,213,175,213,176,213,177,213,178,213,179,213,180,213,181,213,182,213,183,213,184,213,185,213,186,213,187,213,188,213,189,213,190,213,191,213,192,213,193,213,194,213,195,213,196,213,197,213,198,213,199,213,200,213,201,213,202,213,203,213,204,213,205,213,206,213,207,213,208,213,209,213,210,213,211,213,212,213,213,213,214,213,215,213,216,213,217,213,218,213,219,213,220,213,221,213,222,213,223,213,224,213,225,213,226,213,227,213,228,213,229,213,230,213,231,213,232,213,233,213,234,213,235,213,236,213,237,213,238,213,239,213,240,213,241,213,242,213,243,213,244,213,245,213,246,213,247,213,248,213,249,213,250,213,251,213,252,213,253,213,254,214,64,214,65,214,66,214,67,214,68,214,69,214,70,214,71,214,72,214,73,214,74,214,75,214,76,214,77,214,78,214,79,214,80,214,81,214,82,214,83,214,84,214,85,214,86,214,87,214,88,214,89,214,90,214,91,214,92,214,93,214,94,214,95,214,96,214,97,214,98,214,99,214,100,214,101,214,102,214,103,214,104,214,105,214,106,214,107,214,108,214,109,214,110,214,111,214,112,214,113,214,114,214,115,214,116,214,117,214,118,214,119,214,120,214,121,214,122,214,123,214,124,214,125,214,126,214,161,214,162,214,163,214,164,214,165,214,166,214,167,214,168,214,169,214,170,214,171,214,172,214,173,214,174,214,175,214,176,214,177,214,178,214,179,214,180,214,181,214,182,214,183,214,184,214,185,214,186,214,187,214,188,214,189,214,190,214,191,214,192,214,193,214,194,214,195,214,196,214,197,214,198,214,199,214,200,214,201,214,202,214,203,214,204,214,205,214,206,214,207,214,208,214,209,214,210,214,211,214,212,214,213,214,214,214,215,214,216,214,217,214,218,214,219,214,220,214,221,214,222,214,223,214,224,214,225,214,226,214,227,214,228,214,229,214,230,214,231,214,232,214,233,214,234,214,235,214,236,214,237,214,238,214,239,214,240,214,241,214,242,214,243,214,244,214,245,214,246,214,247,214,248,214,249,214,250,214,251,214,252,214,253,214,254,215,64,215,65,215,66,215,67,215,68,215,69,215,70,215,71,215,72,215,73,215,74,215,75,215,76,215,77,215,78,215,79,215,80,215,81,215,82,215,83,215,84,215,85,215,86,215,87,215,88,215,89,215,90,215,91,215,92,215,93,215,94,215,95,215,96,215,97,215,98,215,99,215,100,215,101,215,102,215,103,215,104,215,105,215,106,215,107,215,108,215,109,215,110,215,111,215,112,215,113,215,114,215,115,215,116,215,117,215,118,215,119,215,120,215,121,215,122,215,123,215,124,215,125,215,126,215,161,215,162,215,163,215,164,215,165,215,166,215,167,215,168,215,169,215,170,215,171,215,172,215,173,215,174,215,175,215,176,215,177,215,178,215,179,215,180,215,181,215,182,215,183,215,184,215,185,215,186,215,187,215,188,215,189,215,190,215,191,215,192,215,193,215,194,215,195,215,196,215,197,215,198,215,199,215,200,215,201,215,202,215,203,215,204,215,205,215,206,215,207,215,208,215,209,215,210,215,211,215,212,215,213,215,214,215,215,215,216,215,217,215,218,215,219,215,220,215,221,215,222,215,223,215,224,215,225,215,226,215,227,215,228,215,229,215,230,215,231,215,232,215,233,215,234,215,235,215,236,215,237,215,238,215,239,215,240,215,241,215,242,215,243,215,244,215,245,215,246,215,247,215,248,215,249,215,250,215,251,215,252,215,253,215,254,216,64,216,65,216,66,216,67,216,68,216,69,216,70,216,71,216,72,216,73,216,74,216,75,216,76,216,77,216,78,216,79,216,80,216,81,216,82,216,83,216,84,216,85,216,86,216,87,216,88,216,89,216,90,216,91,216,92,216,93,216,94,216,95,216,96,216,97,216,98,216,99,216,100,216,101,216,102,216,103,216,104,216,105,216,106,216,107,216,108,216,109,216,110,216,111,216,112,216,113,216,114,216,115,216,116,216,117,216,118,216,119,216,120,216,121,216,122,216,123,216,124,216,125,216,126,216,161,216,162,216,163,216,164,216,165,216,166,216,167,216,168,216,169,216,170,216,171,216,172,216,173,216,174,216,175,216,176,216,177,216,178,216,179,216,180,216,181,216,182,216,183,216,184,216,185,216,186,216,187,216,188,216,189,216,190,216,191,216,192,216,193,216,194,216,195,216,196,216,197,216,198,216,199,216,200,216,201,216,202,216,203,216,204,216,205,216,206,216,207,216,208,216,209,216,210,216,211,216,212,216,213,216,214,216,215,216,216,216,217,216,218,216,219,216,220,216,221,216,222,216,223,216,224,216,225,216,226,216,227,216,228,216,229,216,230,216,231,216,232,216,233,216,234,216,235,216,236,216,237,216,238,216,239,216,240,216,241,216,242,216,243,216,244,216,245,216,246,216,247,216,248,216,249,216,250,216,251,216,252,216,253,216,254,217,64,217,65,217,66,217,67,217,68,217,69,217,70,217,71,217,72,217,73,217,74,217,75,217,76,217,77,217,78,217,79,217,80,217,81,217,82,217,83,217,84,217,85,217,86,217,87,217,88,217,89,217,90,217,91,217,92,217,93,217,94,217,95,217,96,217,97,217,98,217,99,217,100,217,101,217,102,217,103,217,104,217,105,217,106,217,107,217,108,217,109,217,110,217,111,217,112,217,113,217,114,217,115,217,116,217,117,217,118,217,119,217,120,217,121,217,122,217,123,217,124,217,125,217,126,217,161,217,162,217,163,217,164,217,165,217,166,217,167,217,168,217,169,217,170,217,171,217,172,217,173,217,174,217,175,217,176,217,177,217,178,217,179,217,180,217,181,217,182,217,183,217,184,217,185,217,186,217,187,217,188,217,189,217,190,217,191,217,192,217,193,217,194,217,195,217,196,217,197,217,198,217,199,217,200,217,201,217,202,217,203,217,204,217,205,217,206,217,207,217,208,217,209,217,210,217,211,217,212,217,213,217,214,217,215,217,216,217,217,217,218,217,219,217,220,217,221,217,222,217,223,217,224,217,225,217,226,217,227,217,228,217,229,217,230,217,231,217,232,217,233,217,234,217,235,217,236,217,237,217,238,217,239,217,240,217,241,217,242,217,243,217,244,217,245,217,246,217,247,217,248,217,249,217,250,217,251,217,252,217,253,217,254,218,64,218,65,218,66,218,67,218,68,218,69,218,70,218,71,218,72,218,73,218,74,218,75,218,76,218,77,218,78,218,79,218,80,218,81,218,82,218,83,218,84,218,85,218,86,218,87,218,88,218,89,218,90,218,91,218,92,218,93,218,94,218,95,218,96,218,97,218,98,218,99,218,100,218,101,218,102,218,103,218,104,218,105,218,106,218,107,218,108,218,109,218,110,218,111,218,112,218,113,218,114,218,115,218,116,218,117,218,118,218,119,218,120,218,121,218,122,218,123,218,124,218,125,218,126,218,161,218,162,218,163,218,164,218,165,218,166,218,167,218,168,218,169,218,170,218,171,218,172,218,173,218,174,218,175,218,176,218,177,218,178,218,179,218,180,218,181,218,182,218,183,218,184,218,185,218,186,218,187,218,188,218,189,218,190,218,191,218,192,218,193,218,194,218,195,218,196,218,197,218,198,218,199,218,200,218,201,218,202,218,203,218,204,218,205,218,206,218,207,218,208,218,209,218,210,218,211,218,212,218,213,218,214,218,215,218,216,218,217,218,218,218,219,218,220,218,221,218,222,218,223,218,224,218,225,218,226,218,227,218,228,218,229,218,230,218,231,218,232,218,233,218,234,218,235,218,236,218,237,218,238,218,239,218,240,218,241,218,242,218,243,218,244,218,245,218,246,218,247,218,248,218,249,218,250,218,251,218,252,218,253,218,254,219,64,219,65,219,66,219,67,219,68,219,69,219,70,219,71,219,72,219,73,219,74,219,75,219,76,219,77,219,78,219,79,219,80,219,81,219,82,219,83,219,84,219,85,219,86,219,87,219,88,219,89,219,90,219,91,219,92,219,94,219,95,219,96,219,97,219,98,219,99,219,100,219,101,219,102,219,103,219,104,219,105,219,106,219,107,219,108,219,109,219,110,219,111,219,112,219,113,219,114,219,115,219,116,219,117,219,118,219,119,219,120,219,122,219,123,219,124,219,125,219,126,219,161,219,162,219,163,219,164,219,165,219,166,219,167,219,168,219,169,219,170,219,171,219,172,219,173,219,174,219,175,219,176,219,177,219,178,219,179,219,180,219,181,219,182,219,183,219,184,219,185,219,186,219,187,219,188,219,189,219,190,219,191,219,192,219,193,219,194,219,195,219,196,219,197,219,198,219,199,219,200,219,201,219,202,219,203,219,204,219,205,219,206,219,207,219,208,219,209,219,210,219,211,219,212,219,213,219,214,219,215,219,216,219,217,219,218,219,219,219,220,219,221,219,222,219,223,219,224,219,225,219,226,219,227,219,228,219,229,219,230,219,231,219,232,219,233,219,234,219,235,219,236,219,237,219,238,219,239,219,240,219,241,219,242,219,243,219,244,219,245,219,246,219,247,219,248,219,249,219,250,219,251,219,252,219,253,219,254,220,64,220,65,220,66,220,67,220,68,220,69,220,70,220,71,220,72,220,73,220,74,220,75,220,76,220,77,220,78,220,79,220,80,220,81,220,83,220,84,220,85,220,86,220,87,220,88,220,89,220,90,220,91,220,92,220,93,220,94,220,95,220,96,220,97,220,98,220,99,220,100,220,101,220,102,220,103,220,104,220,105,220,106,220,107,220,108,220,109,220,110,220,111,220,112,220,113,220,114,220,115,220,116,220,117,220,118,220,119,220,120,220,121,220,122,220,123,220,124,220,125,220,126,220,161,220,162,220,163,220,164,220,165,220,166,220,167,220,168,220,169,220,170,220,171,220,172,220,173,220,174,220,175,220,176,220,177,220,178,220,179,220,180,220,181,220,182,220,183,220,184,220,185,220,186,220,187,220,188,220,189,220,190,220,191,220,192,220,193,220,194,220,195,220,196,220,197,220,198,220,199,220,200,220,201,220,202,220,203,220,204,220,205,220,206,220,207,220,208,220,209,220,210,220,211,220,212,220,213,220,214,220,215,220,216,220,217,220,218,220,219,220,220,220,221,220,222,220,223,220,224,220,225,220,226,220,227,220,228,220,229,220,230,220,231,220,232,220,233,220,234,220,235,220,236,220,237,220,238,220,239,220,240,220,241,220,242,220,243,220,244,220,245,220,246,220,247,220,248,220,249,220,250,220,251,220,252,220,253,220,254,221,64,221,65,221,66,221,67,221,68,221,69,221,70,221,71,221,72,221,73,221,74,221,75,221,76,221,77,221,78,221,79,221,80,221,81,221,82,221,83,221,84,221,85,221,86,221,87,221,88,221,89,221,90,221,91,221,92,221,93,221,94,221,95,221,96,221,97,221,98,221,99,221,100,221,101,221,102,221,103,221,104,221,105,221,106,221,107,221,108,221,109,221,110,221,111,221,112,221,113,221,114,221,115,221,116,221,117,221,118,221,119,221,120,221,121,221,122,221,123,221,124,221,125,221,126,221,161,221,162,221,163,221,164,221,165,221,166,221,167,221,168,221,169,221,170,221,171,221,172,221,173,221,174,221,175,221,176,221,177,221,178,221,179,221,180,221,181,221,182,221,183,221,184,221,185,221,186,221,187,221,188,221,189,221,190,221,191,221,192,221,193,221,194,221,195,221,196,221,197,221,198,221,199,221,200,221,201,221,202,221,203,221,204,221,205,221,206,221,207,221,208,221,209,221,210,221,211,221,212,221,213,221,214,221,215,221,216,221,217,221,218,221,219,221,220,221,221,221,222,221,223,221,224,221,225,221,226,221,227,221,228,221,229,221,230,221,231,221,232,221,233,221,234,221,235,221,236,221,237,221,238,221,239,221,240,221,241,221,242,221,243,221,244,221,245,221,246,221,247,221,248,221,249,221,250,221,251,221,252,221,253,221,254,222,64,222,65,222,66,222,67,222,68,222,69,222,70,222,71,222,72,222,73,222,74,222,75,222,76,222,77,222,78,222,79,222,80,222,81,222,82,222,83,222,84,222,85,222,86,222,87,222,88,222,89,222,90,222,91,222,92,222,93,222,94,222,95,222,96,222,97,222,98,222,99,222,100,222,101,222,102,222,103,222,104,222,105,222,106,222,107,222,108,222,109,222,110,222,111,222,112,222,113,222,115,222,116,222,117,222,118,222,119,222,120,222,121,222,122,222,123,222,124,222,125,222,126,222,161,222,162,222,163,222,164,222,165,222,166,222,167,222,168,222,169,222,170,222,171,222,172,222,173,222,174,222,175,222,176,222,177,222,178,222,179,222,180,222,181,222,182,222,183,222,184,222,185,222,186,222,187,222,188,222,189,222,190,222,191,222,192,222,193,222,194,222,195,222,196,222,197,222,198,222,199,222,200,222,201,222,202,222,203,222,204,222,206,222,207,222,208,222,209,222,210,222,211,222,212,222,213,222,214,222,215,222,216,222,217,222,218,222,219,222,220,222,221,222,222,222,223,222,224,222,225,222,226,222,227,222,228,222,229,222,230,222,231,222,232,222,233,222,234,222,235,222,236,222,237,222,238,222,239,222,240,222,241,222,242,222,243,222,244,222,245,222,246,222,247,222,248,222,249,222,250,222,251,222,252,222,253,222,254,223,64,223,65,223,66,223,67,223,68,223,69,223,70,223,71,223,72,223,73,223,74,223,75,223,76,223,77,223,78,223,79,223,80,223,81,223,82,223,83,223,84,223,85,223,86,223,87,223,88,223,89,223,90,223,91,223,92,223,93,223,94,223,95,223,96,223,97,223,98,223,99,223,100,223,101,223,102,223,103,223,104,223,105,223,106,223,107,223,108,223,109,223,110,223,111,223,112,223,113,223,114,223,115,223,116,223,117,223,118,223,119,223,120,223,121,223,122,223,123,223,124,223,125,223,126,223,161,223,162,223,163,223,164,223,165,223,166,223,167,223,168,223,169,223,170,223,171,223,172,223,173,223,174,223,175,223,176,223,177,223,178,223,179,223,180,223,181,223,182,223,183,223,184,223,185,223,186,223,187,223,188,223,189,223,190,223,191,223,192,223,193,223,194,223,195,223,196,223,197,223,198,223,199,223,200,223,201,223,202,223,203,223,204,223,205,223,206,223,207,223,208,223,209,223,210,223,211,223,212,223,213,223,214,223,215,223,216,223,217,223,218,223,219,223,220,223,221,223,222,223,223,223,224,223,225,223,226,223,227,223,228,223,229,223,230,223,231,223,232,223,233,223,234,223,235,223,236,223,237,223,238,223,239,223,240,223,241,223,242,223,243,223,244,223,245,223,246,223,247,223,248,223,249,223,250,223,251,223,252,223,253,223,254,224,64,224,65,224,66,224,67,224,68,224,69,224,70,224,71,224,72,224,73,224,74,224,75,224,76,224,77,224,78,224,79,224,80,224,81,224,82,224,83,224,84,224,85,224,86,224,87,224,88,224,89,224,90,224,91,224,92,224,93,224,94,224,95,224,96,224,97,224,98,224,99,224,100,224,101,224,102,224,103,224,104,224,105,224,106,224,107,224,108,224,109,224,110,224,111,224,112,224,113,224,114,224,115,224,116,224,117,224,118,224,119,224,120,224,121,224,122,224,123,224,125,224,126,224,161,224,162,224,163,224,164,224,165,224,166,224,167,224,168,224,169,224,170,224,171,224,172,224,173,224,174,224,175,224,176,224,177,224,178,224,179,224,180,224,181,224,182,224,183,224,184,224,185,224,186,224,187,224,188,224,189,224,190,224,191,224,192,224,193,224,194,224,195,224,196,224,197,224,198,224,199,224,200,224,201,224,202,224,203,224,204,224,205,224,206,224,207,224,208,224,209,224,210,224,211,224,212,224,213,224,214,224,215,224,216,224,217,224,218,224,219,224,220,224,221,224,222,224,223,224,224,224,225,224,226,224,227,224,228,224,229,224,230,224,231,224,232,224,233,224,234,224,235,224,236,224,237,224,238,224,239,224,240,224,241,224,242,224,243,224,244,224,245,224,246,224,247,224,248,224,249,224,250,224,251,224,252,224,253,224,254,225,64,225,65,225,66,225,67,225,68,225,69,225,70,225,71,225,72,225,73,225,74,225,75,225,76,225,77,225,78,225,79,225,80,225,81,225,82,225,83,225,84,225,85,225,86,225,87,225,88,225,89,225,90,225,91,225,92,225,93,225,94,225,95,225,96,225,97,225,98,225,99,225,100,225,101,225,102,225,103,225,104,225,105,225,106,225,107,225,108,225,109,225,110,225,111,225,112,225,113,225,114,225,115,225,116,225,117,225,118,225,119,225,120,225,121,225,122,225,123,225,124,225,125,225,126,225,161,225,162,225,163,225,164,225,165,225,166,225,167,225,168,225,169,225,170,225,171,225,172,225,173,225,174,225,175,225,176,225,177,225,178,225,179,225,180,225,181,225,182,225,183,225,184,225,185,225,186,225,187,225,188,225,189,225,190,225,191,225,192,225,193,225,194,225,195,225,196,225,197,225,198,225,199,225,200,225,201,225,202,225,203,225,204,225,205,225,206,225,207,225,208,225,209,225,210,225,211,225,212,225,213,225,214,225,215,225,216,225,217,225,218,225,219,225,220,225,221,225,222,225,223,225,224,225,225,225,226,225,227,225,228,225,229,225,230,225,231,225,232,225,233,225,234,225,235,225,236,225,237,225,238,225,239,225,240,225,241,225,242,225,243,225,244,225,245,225,246,225,247,225,248,225,249,225,250,225,251,225,252,225,253,225,254,226,64,226,65,226,66,226,67,226,68,226,69,226,70,226,71,226,72,226,73,226,74,226,75,226,76,226,77,226,78,226,79,226,80,226,81,226,82,226,83,226,84,226,85,226,86,226,87,226,88,226,89,226,90,226,91,226,92,226,93,226,94,226,95,226,96,226,97,226,98,226,99,226,100,226,101,226,102,226,103,226,104,226,105,226,106,226,107,226,108,226,109,226,110,226,111,226,112,226,113,226,114,226,115,226,116,226,117,226,118,226,119,226,120,226,121,226,122,226,123,226,124,226,125,226,126,226,161,226,162,226,163,226,164,226,165,226,166,226,167,226,168,226,169,226,170,226,171,226,172,226,173,226,174,226,175,226,176,226,177,226,178,226,179,226,180,226,181,226,182,226,183,226,184,226,185,226,186,226,187,226,188,226,189,226,190,226,191,226,192,226,193,226,194,226,195,226,196,226,197,226,198,226,199,226,200,226,201,226,202,226,203,226,204,226,205,226,206,226,207,226,208,226,209,226,210,226,211,226,212,226,213,226,214,226,215,226,216,226,217,226,218,226,219,226,220,226,221,226,222,226,223,226,224,226,225,226,226,226,227,226,228,226,229,226,230,226,231,226,232,226,233,226,234,226,235,226,236,226,237,226,238,226,239,226,240,226,241,226,242,226,243,226,244,226,245,226,246,226,247,226,248,226,249,226,250,226,251,226,252,226,253,226,254,227,64,227,65,227,66,227,67,227,68,227,69,227,70,227,71,227,72,227,73,227,74,227,75,227,76,227,77,227,78,227,79,227,80,227,81,227,82,227,83,227,84,227,85,227,86,227,87,227,88,227,89,227,90,227,91,227,92,227,93,227,94,227,95,227,96,227,97,227,98,227,99,227,100,227,101,227,102,227,103,227,104,227,105,227,106,227,107,227,108,227,109,227,110,227,111,227,112,227,113,227,114,227,115,227,116,227,117,227,118,227,119,227,120,227,121,227,122,227,123,227,124,227,125,227,126,227,161,227,162,227,163,227,164,227,165,227,166,227,167,227,168,227,169,227,170,227,171,227,172,227,173,227,174,227,175,227,176,227,177,227,178,227,179,227,180,227,181,227,182,227,183,227,184,227,185,227,186,227,187,227,188,227,189,227,190,227,191,227,192,227,193,227,194,227,195,227,196,227,197,227,198,227,199,227,201,227,202,227,203,227,204,227,205,227,206,227,207,227,208,227,209,227,210,227,211,227,212,227,213,227,214,227,215,227,216,227,217,227,218,227,219,227,220,227,221,227,222,227,223,227,224,227,225,227,226,227,227,227,228,227,229,227,230,227,231,227,232,227,233,227,234,227,235,227,236,227,237,227,238,227,239,227,240,227,241,227,242,227,243,227,244,227,245,227,246,227,247,227,248,227,249,227,250,227,251,227,252,227,253,227,254,228,64,228,65,228,66,228,67,228,68,228,69,228,70,228,71,228,72,228,73,228,74,228,75,228,76,228,77,228,78,228,79,228,80,228,81,228,82,228,83,228,84,228,85,228,86,228,87,228,88,228,89,228,90,228,91,228,92,228,93,228,94,228,95,228,96,228,97,228,98,228,99,228,100,228,101,228,102,228,103,228,104,228,105,228,106,228,107,228,108,228,109,228,110,228,111,228,112,228,113,228,114,228,115,228,116,228,117,228,118,228,119,228,120,228,121,228,122,228,123,228,124,228,125,228,126,228,161,228,162,228,163,228,164,228,165,228,166,228,167,228,168,228,169,228,170,228,171,228,172,228,173,228,174,228,175,228,176,228,177,228,178,228,179,228,180,228,181,228,182,228,183,228,184,228,185,228,186,228,187,228,188,228,189,228,190,228,191,228,192,228,193,228,194,228,195,228,196,228,197,228,198,228,199,228,200,228,201,228,202,228,203,228,204,228,205,228,206,228,207,228,208,228,209,228,210,228,211,228,212,228,213,228,214,228,215,228,216,228,217,228,218,228,219,228,220,228,221,228,222,228,223,228,224,228,225,228,226,228,227,228,228,228,229,228,230,228,231,228,232,228,233,228,234,228,235,228,236,228,237,228,238,228,239,228,240,228,241,228,242,228,243,228,244,228,245,228,246,228,247,228,248,228,249,228,250,228,251,228,252,228,253,228,254,229,64,229,65,229,66,229,67,229,68,229,69,229,70,229,71,229,72,229,73,229,74,229,75,229,76,229,77,229,78,229,79,229,80,229,81,229,82,229,83,229,84,229,85,229,86,229,87,229,88,229,89,229,90,229,91,229,92,229,93,229,94,229,95,229,96,229,97,229,98,229,99,229,100,229,101,229,102,229,103,229,104,229,105,229,106,229,107,229,108,229,109,229,110,229,111,229,112,229,113,229,114,229,115,229,116,229,117,229,118,229,119,229,120,229,121,229,122,229,123,229,124,229,125,229,126,229,161,229,162,229,163,229,164,229,165,229,166,229,167,229,168,229,169,229,170,229,171,229,172,229,173,229,174,229,175,229,176,229,177,229,178,229,179,229,180,229,181,229,182,229,183,229,184,229,185,229,186,229,187,229,188,229,189,229,190,229,191,229,192,229,193,229,194,229,195,229,196,229,197,229,198,229,199,229,200,229,201,229,202,229,203,229,204,229,205,229,206,229,207,229,208,229,209,229,210,229,211,229,212,229,213,229,214,229,215,229,216,229,217,229,218,229,219,229,220,229,221,229,222,229,223,229,224,229,225,229,226,229,227,229,228,229,229,229,230,229,231,229,232,229,233,229,234,229,235,229,236,229,237,229,238,229,239,229,240,229,241,229,242,229,243,229,244,229,245,229,246,229,247,229,248,229,249,229,250,229,251,229,252,229,253,229,254,230,64,230,65,230,66,230,67,230,68,230,69,230,70,230,71,230,72,230,73,230,74,230,75,230,76,230,77,230,78,230,79,230,80,230,81,230,82,230,83,230,84,230,85,230,86,230,87,230,88,230,89,230,90,230,91,230,92,230,93,230,94,230,95,230,96,230,97,230,98,230,99,230,100,230,101,230,102,230,103,230,104,230,105,230,106,230,107,230,108,230,109,230,110,230,111,230,112,230,113,230,114,230,115,230,116,230,117,230,118,230,119,230,120,230,121,230,122,230,123,230,124,230,125,230,126,230,161,230,162,230,163,230,164,230,165,230,166,230,167,230,168,230,169,230,170,230,172,230,173,230,174,230,175,230,176,230,177,230,178,230,179,230,180,230,181,230,182,230,183,230,184,230,185,230,186,230,187,230,188,230,189,230,190,230,191,230,192,230,193,230,194,230,195,230,196,230,197,230,198,230,199,230,200,230,201,230,202,230,203,230,204,230,205,230,206,230,207,230,209,230,210,230,211,230,212,230,213,230,214,230,215,230,216,230,217,230,218,230,219,230,220,230,221,230,222,230,223,230,224,230,225,230,226,230,227,230,228,230,229,230,230,230,231,230,232,230,233,230,234,230,235,230,236,230,237,230,238,230,239,230,240,230,241,230,242,230,243,230,244,230,245,230,246,230,247,230,248,230,249,230,250,230,251,230,252,230,253,230,254,231,64,231,65,231,66,231,67,231,68,231,69,231,70,231,71,231,72,231,73,231,74,231,75,231,76,231,77,231,78,231,79,231,80,231,81,231,82,231,83,231,84,231,85,231,86,231,87,231,88,231,89,231,90,231,91,231,92,231,93,231,94,231,95,231,96,231,97,231,98,231,99,231,100,231,101,231,102,231,103,231,104,231,105,231,106,231,107,231,108,231,109,231,110,231,111,231,112,231,113,231,114,231,115,231,116,231,117,231,118,231,119,231,120,231,121,231,122,231,123,231,124,231,125,231,126,231,161,231,162,231,163,231,164,231,165,231,166,231,167,231,168,231,169,231,170,231,171,231,172,231,173,231,174,231,175,231,176,231,177,231,178,231,179,231,180,231,181,231,182,231,183,231,184,231,185,231,186,231,187,231,188,231,189,231,190,231,191,231,192,231,193,231,194,231,195,231,196,231,197,231,198,231,199,231,200,231,201,231,202,231,203,231,204,231,205,231,206,231,207,231,208,231,209,231,210,231,211,231,212,231,213,231,214,231,215,231,216,231,217,231,218,231,219,231,220,231,221,231,222,231,223,231,224,231,225,231,226,231,227,231,228,231,229,231,230,231,231,231,232,231,233,231,234,231,235,231,236,231,237,231,238,231,239,231,240,231,241,231,242,231,243,231,244,231,245,231,246,231,247,231,248,231,249,231,250,231,251,231,252,231,253,231,254,232,64,232,65,232,66,232,67,232,68,232,69,232,70,232,71,232,72,232,73,232,74,232,75,232,76,232,77,232,78,232,79,232,80,232,81,232,82,232,83,232,84,232,85,232,86,232,87,232,88,232,89,232,90,232,91,232,92,232,93,232,94,232,95,232,96,232,97,232,98,232,99,232,100,232,101,232,102,232,103,232,104,232,105,232,106,232,107,232,108,232,109,232,110,232,111,232,112,232,113,232,114,232,115,232,116,232,117,232,118,232,119,232,120,232,121,232,122,232,123,232,124,232,125,232,126,232,161,232,162,232,163,232,164,232,165,232,166,232,167,232,168,232,169,232,170,232,171,232,172,232,173,232,174,232,175,232,176,232,177,232,178,232,179,232,180,232,181,232,182,232,183,232,184,232,185,232,186,232,187,232,188,232,189,232,190,232,191,232,192,232,193,232,194,232,195,232,196,232,197,232,198,232,199,232,200,232,201,232,202,232,203,232,204,232,206,232,207,232,208,232,209,232,210,232,211,232,212,232,213,232,214,232,215,232,216,232,217,232,218,232,219,232,220,232,221,232,222,232,223,232,224,232,225,232,226,232,227,232,228,232,229,232,230,232,231,232,232,232,233,232,234,232,235,232,236,232,237,232,238,232,239,232,240,232,241,232,242,232,243,232,244,232,245,232,246,232,247,232,248,232,249,232,250,232,251,232,252,232,253,232,254,233,64,233,65,233,66,233,67,233,68,233,69,233,70,233,71,233,72,233,73,233,74,233,75,233,76,233,77,233,78,233,79,233,80,233,81,233,82,233,83,233,84,233,85,233,86,233,87,233,88,233,90,233,91,233,92,233,93,233,94,233,95,233,96,233,97,233,98,233,99,233,100,233,101,233,102,233,103,233,104,233,105,233,106,233,107,233,108,233,109,233,110,233,111,233,112,233,113,233,114,233,115,233,116,233,117,233,118,233,119,233,120,233,121,233,122,233,123,233,124,233,125,233,126,233,161,233,162,233,163,233,164,233,165,233,166,233,167,233,168,233,169,233,170,233,171,233,172,233,173,233,174,233,175,233,176,233,177,233,178,233,179,233,180,233,181,233,182,233,183,233,184,233,185,233,186,233,187,233,188,233,189,233,190,233,191,233,192,233,193,233,194,233,195,233,196,233,197,233,198,233,199,233,200,233,201,233,202,233,203,233,204,233,205,233,206,233,207,233,208,233,209,233,210,233,211,233,212,233,213,233,214,233,215,233,216,233,217,233,218,233,219,233,220,233,221,233,222,233,223,233,224,233,225,233,226,233,227,233,228,233,229,233,230,233,231,233,232,233,233,233,234,233,235,233,236,233,237,233,238,233,239,233,240,233,241,233,242,233,243,233,244,233,245,233,246,233,247,233,248,233,249,233,250,233,251,233,252,233,253,233,254,234,64,234,65,234,66,234,67,234,68,234,69,234,70,234,71,234,72,234,73,234,74,234,75,234,76,234,77,234,78,234,79,234,80,234,81,234,82,234,83,234,84,234,85,234,86,234,87,234,88,234,89,234,90,234,91,234,92,234,93,234,94,234,95,234,96,234,97,234,98,234,99,234,100,234,101,234,102,234,103,234,104,234,105,234,106,234,107,234,108,234,109,234,110,234,111,234,112,234,113,234,114,234,115,234,116,234,117,234,118,234,119,234,120,234,121,234,122,234,123,234,124,234,125,234,126,234,161,234,162,234,163,234,164,234,165,234,166,234,167,234,168,234,169,234,170,234,171,234,172,234,173,234,174,234,175,234,176,234,177,234,178,234,179,234,180,234,181,234,182,234,183,234,184,234,185,234,186,234,187,234,188,234,189,234,190,234,191,234,192,234,193,234,194,234,195,234,196,234,197,234,198,234,199,234,200,234,201,234,202,234,203,234,204,234,205,234,206,234,207,234,208,234,209,234,210,234,211,234,212,234,213,234,214,234,215,234,216,234,217,234,218,234,219,234,220,234,221,234,222,234,223,234,224,234,225,234,226,234,227,234,228,234,229,234,230,234,231,234,232,234,233,234,234,234,235,234,236,234,237,234,238,234,239,234,240,234,241,234,242,234,243,234,244,234,245,234,246,234,247,234,248,234,249,234,250,234,251,234,252,234,253,234,254,235,64,235,65,235,66,235,67,235,68,235,69,235,70,235,71,235,72,235,73,235,74,235,75,235,76,235,77,235,78,235,79,235,80,235,81,235,82,235,83,235,84,235,85,235,86,235,87,235,88,235,89,235,90,235,91,235,92,235,93,235,94,235,95,235,96,235,97,235,98,235,99,235,100,235,101,235,102,235,103,235,104,235,105,235,106,235,107,235,108,235,109,235,110,235,111,235,112,235,113,235,114,235,115,235,116,235,117,235,118,235,119,235,120,235,121,235,122,235,123,235,124,235,125,235,126,235,161,235,162,235,163,235,164,235,165,235,166,235,167,235,168,235,169,235,170,235,171,235,172,235,173,235,174,235,175,235,176,235,177,235,178,235,179,235,180,235,181,235,182,235,183,235,184,235,185,235,186,235,187,235,188,235,189,235,190,235,191,235,192,235,193,235,194,235,195,235,196,235,197,235,198,235,199,235,200,235,202,235,203,235,204,235,205,235,206,235,207,235,208,235,209,235,210,235,211,235,212,235,213,235,214,235,215,235,216,235,217,235,218,235,219,235,220,235,221,235,222,235,223,235,224,235,225,235,226,235,227,235,228,235,229,235,230,235,231,235,232,235,233,235,234,235,235,235,236,235,237,235,238,235,239,235,240,235,241,235,242,235,243,235,244,235,245,235,246,235,247,235,248,235,249,235,250,235,251,235,252,235,253,235,254,236,64,236,65,236,66,236,67,236,68,236,69,236,70,236,71,236,72,236,73,236,74,236,75,236,76,236,77,236,78,236,79,236,80,236,81,236,82,236,83,236,84,236,85,236,86,236,87,236,88,236,89,236,90,236,91,236,92,236,93,236,94,236,95,236,96,236,97,236,98,236,99,236,100,236,101,236,102,236,103,236,104,236,105,236,106,236,107,236,108,236,109,236,110,236,111,236,112,236,113,236,114,236,115,236,116,236,117,236,118,236,119,236,120,236,121,236,122,236,123,236,124,236,125,236,126,236,161,236,162,236,163,236,164,236,165,236,166,236,167,236,168,236,169,236,170,236,171,236,172,236,173,236,174,236,175,236,176,236,177,236,178,236,179,236,180,236,181,236,182,236,183,236,184,236,185,236,186,236,187,236,188,236,189,236,190,236,191,236,192,236,193,236,194,236,195,236,196,236,197,236,198,236,199,236,200,236,201,236,202,236,203,236,204,236,205,236,206,236,207,236,208,236,209,236,210,236,211,236,212,236,213,236,214,236,215,236,216,236,217,236,218,236,219,236,220,236,221,236,222,236,223,236,224,236,225,236,226,236,227,236,228,236,229,236,230,236,231,236,232,236,233,236,234,236,235,236,236,236,237,236,238,236,239,236,240,236,241,236,242,236,243,236,244,236,245,236,246,236,247,236,248,236,249,236,250,236,251,236,252,236,253,236,254,237,64,237,65,237,66,237,67,237,68,237,69,237,70,237,71,237,72,237,73,237,74,237,75,237,76,237,77,237,78,237,79,237,80,237,81,237,82,237,83,237,84,237,85,237,86,237,87,237,88,237,89,237,90,237,91,237,92,237,93,237,94,237,95,237,96,237,97,237,98,237,99,237,100,237,101,237,102,237,103,237,104,237,105,237,106,237,107,237,108,237,109,237,110,237,111,237,112,237,113,237,114,237,115,237,116,237,117,237,118,237,119,237,120,237,121,237,122,237,123,237,124,237,125,237,126,237,161,237,162,237,163,237,164,237,165,237,166,237,167,237,168,237,169,237,170,237,171,237,172,237,173,237,174,237,175,237,176,237,177,237,178,237,179,237,180,237,181,237,182,237,183,237,184,237,185,237,186,237,187,237,188,237,189,237,190,237,191,237,192,237,193,237,194,237,195,237,196,237,197,237,198,237,199,237,200,237,201,237,203,237,204,237,205,237,206,237,207,237,208,237,209,237,210,237,211,237,212,237,213,237,214,237,215,237,216,237,217,237,218,237,219,237,220,237,221,237,222,237,223,237,224,237,225,237,226,237,227,237,228,237,229,237,230,237,231,237,232,237,233,237,234,237,235,237,236,237,237,237,238,237,239,237,240,237,241,237,242,237,243,237,244,237,245,237,246,237,247,237,248,237,249,237,250,237,251,237,252,237,253,237,254,238,64,238,65,238,66,238,67,238,68,238,69,238,70,238,71,238,72,238,73,238,74,238,75,238,76,238,77,238,78,238,79,238,80,238,81,238,82,238,83,238,84,238,85,238,86,238,87,238,88,238,89,238,90,238,91,238,92,238,93,238,94,238,95,238,96,238,97,238,98,238,99,238,100,238,101,238,102,238,103,238,104,238,105,238,106,238,107,238,108,238,109,238,110,238,111,238,112,238,113,238,114,238,115,238,116,238,117,238,118,238,119,238,120,238,121,238,122,238,123,238,124,238,125,238,126,238,161,238,162,238,163,238,164,238,165,238,166,238,167,238,168,238,169,238,170,238,171,238,172,238,173,238,174,238,175,238,176,238,177,238,178,238,179,238,180,238,181,238,182,238,183,238,184,238,185,238,186,238,187,238,188,238,189,238,190,238,191,238,192,238,193,238,194,238,195,238,196,238,197,238,198,238,199,238,200,238,201,238,202,238,203,238,204,238,205,238,206,238,207,238,208,238,209,238,210,238,211,238,212,238,213,238,214,238,215,238,216,238,217,238,218,238,219,238,220,238,221,238,222,238,223,238,224,238,225,238,226,238,227,238,228,238,229,238,230,238,231,238,232,238,233,238,234,238,235,238,236,238,237,238,238,238,239,238,240,238,241,238,242,238,243,238,244,238,245,238,246,238,247,238,248,238,249,238,250,238,251,238,252,238,253,238,254,239,64,239,65,239,66,239,67,239,68,239,69,239,70,239,71,239,72,239,73,239,74,239,75,239,76,239,77,239,78,239,79,239,80,239,81,239,82,239,83,239,84,239,85,239,86,239,87,239,88,239,89,239,90,239,91,239,92,239,93,239,94,239,95,239,96,239,97,239,98,239,99,239,100,239,101,239,102,239,103,239,104,239,105,239,106,239,107,239,108,239,109,239,110,239,111,239,112,239,113,239,114,239,115,239,116,239,117,239,118,239,119,239,120,239,121,239,122,239,123,239,124,239,125,239,126,239,161,239,162,239,163,239,164,239,165,239,166,239,167,239,168,239,169,239,170,239,171,239,172,239,173,239,174,239,175,239,176,239,177,239,178,239,179,239,180,239,181,239,182,239,183,239,184,239,185,239,186,239,187,239,188,239,189,239,190,239,191,239,192,239,193,239,194,239,195,239,196,239,197,239,198,239,199,239,200,239,201,239,202,239,203,239,204,239,205,239,206,239,207,239,208,239,209,239,210,239,211,239,212,239,213,239,214,239,215,239,216,239,217,239,218,239,219,239,220,239,221,239,222,239,223,239,224,239,225,239,226,239,227,239,228,239,229,239,230,239,231,239,232,239,233,239,234,239,235,239,236,239,237,239,238,239,239,239,240,239,241,239,242,239,243,239,244,239,245,239,246,239,247,239,248,239,250,239,251,239,252,239,253,239,254,240,64,240,65,240,66,240,67,240,68,240,69,240,70,240,71,240,72,240,73,240,74,240,75,240,76,240,77,240,78,240,79,240,80,240,81,240,82,240,83,240,84,240,85,240,86,240,87,240,88,240,89,240,90,240,91,240,92,240,93,240,94,240,95,240,96,240,97,240,98,240,99,240,100,240,101,240,102,240,103,240,104,240,105,240,106,240,107,240,108,240,109,240,110,240,111,240,112,240,113,240,114,240,115,240,116,240,117,240,118,240,119,240,120,240,121,240,122,240,123,240,124,240,125,240,126,240,161,240,162,240,163,240,164,240,165,240,166,240,167,240,168,240,169,240,170,240,171,240,172,240,173,240,174,240,175,240,176,240,177,240,178,240,179,240,180,240,181,240,182,240,183,240,184,240,185,240,186,240,187,240,188,240,189,240,190,240,191,240,192,240,193,240,194,240,195,240,196,240,197,240,198,240,199,240,200,240,201,240,202,240,203,240,204,240,205,240,206,240,207,240,208,240,209,240,210,240,211,240,212,240,213,240,214,240,215,240,216,240,217,240,218,240,219,240,220,240,221,240,222,240,223,240,224,240,225,240,226,240,227,240,228,240,229,240,230,240,231,240,232,240,233,240,234,240,235,240,236,240,237,240,238,240,239,240,240,240,241,240,242,240,243,240,244,240,245,240,246,240,247,240,248,240,249,240,250,240,251,240,252,240,253,240,254,241,64,241,65,241,66,241,67,241,68,241,69,241,70,241,71,241,72,241,73,241,74,241,75,241,76,241,77,241,78,241,79,241,80,241,81,241,82,241,83,241,84,241,85,241,86,241,87,241,88,241,89,241,90,241,91,241,92,241,93,241,94,241,95,241,96,241,97,241,98,241,99,241,100,241,101,241,102,241,103,241,104,241,105,241,106,241,107,241,108,241,109,241,110,241,111,241,112,241,113,241,114,241,115,241,116,241,117,241,118,241,119,241,120,241,121,241,122,241,123,241,124,241,125,241,126,241,161,241,162,241,163,241,164,241,165,241,166,241,167,241,168,241,169,241,170,241,171,241,172,241,173,241,174,241,175,241,176,241,177,241,178,241,179,241,180,241,181,241,182,241,183,241,184,241,185,241,186,241,187,241,188,241,189,241,190,241,191,241,192,241,193,241,194,241,195,241,196,241,197,241,198,241,199,241,200,241,201,241,202,241,203,241,204,241,205,241,206,241,207,241,208,241,209,241,210,241,211,241,212,241,213,241,214,241,215,241,216,241,217,241,218,241,219,241,220,241,221,241,222,241,223,241,224,241,225,241,226,241,228,241,229,241,230,241,231,241,232,241,233,241,234,241,235,241,236,241,237,241,238,241,239,241,240,241,241,241,242,241,243,241,244,241,245,241,246,241,247,241,248,241,249,241,250,241,251,241,252,241,253,241,254,242,64,242,65,242,66,242,67,242,68,242,69,242,70,242,71,242,72,242,73,242,74,242,75,242,76,242,77,242,78,242,79,242,80,242,81,242,82,242,83,242,84,242,85,242,86,242,87,242,88,242,89,242,90,242,91,242,92,242,93,242,94,242,95,242,96,242,97,242,98,242,99,242,100,242,101,242,102,242,103,242,104,242,105,242,106,242,107,242,108,242,109,242,110,242,111,242,112,242,113,242,114,242,115,242,116,242,117,242,118,242,119,242,120,242,121,242,122,242,123,242,124,242,125,242,126,242,161,242,162,242,163,242,164,242,165,242,166,242,167,242,168,242,169,242,170,242,171,242,172,242,173,242,174,242,175,242,176,242,177,242,178,242,179,242,180,242,181,242,182,242,183,242,184,242,185,242,186,242,187,242,188,242,189,242,190,242,191,242,192,242,193,242,194,242,195,242,196,242,197,242,198,242,199,242,200,242,201,242,202,242,203,242,204,242,205,242,206,242,207,242,208,242,209,242,210,242,211,242,212,242,213,242,214,242,215,242,216,242,217,242,218,242,219,242,220,242,221,242,222,242,223,242,224,242,225,242,226,242,227,242,228,242,229,242,230,242,231,242,232,242,233,242,234,242,235,242,236,242,237,242,238,242,239,242,240,242,241,242,242,242,243,242,244,242,245,242,246,242,247,242,248,242,249,242,250,242,251,242,252,242,253,242,254,243,64,243,65,243,66,243,67,243,68,243,69,243,70,243,71,243,72,243,73,243,74,243,75,243,76,243,77,243,78,243,79,243,80,243,81,243,82,243,83,243,84,243,85,243,86,243,87,243,88,243,89,243,90,243,91,243,92,243,93,243,94,243,95,243,96,243,97,243,98,243,99,243,100,243,101,243,102,243,103,243,104,243,105,243,106,243,107,243,108,243,109,243,110,243,111,243,112,243,113,243,114,243,115,243,116,243,117,243,118,243,119,243,120,243,121,243,122,243,123,243,124,243,125,243,126,243,161,243,162,243,163,243,164,243,165,243,166,243,167,243,168,243,169,243,170,243,171,243,172,243,173,243,174,243,175,243,176,243,177,243,178,243,179,243,180,243,181,243,182,243,183,243,184,243,185,243,186,243,187,243,188,243,189,243,190,243,191,243,192,243,193,243,194,243,195,243,196,243,197,243,198,243,199,243,200,243,201,243,202,243,203,243,204,243,205,243,206,243,207,243,208,243,209,243,210,243,211,243,212,243,213,243,214,243,215,243,216,243,217,243,218,243,219,243,220,243,221,243,222,243,223,243,224,243,225,243,226,243,227,243,228,243,229,243,230,243,231,243,232,243,233,243,234,243,235,243,236,243,237,243,238,243,239,243,240,243,241,243,242,243,243,243,244,243,245,243,246,243,247,243,248,243,249,243,250,243,251,243,252,243,253,243,254,244,64,244,65,244,66,244,67,244,68,244,69,244,70,244,71,244,72,244,73,244,74,244,75,244,76,244,77,244,78,244,79,244,80,244,81,244,82,244,83,244,84,244,85,244,86,244,87,244,88,244,89,244,90,244,91,244,92,244,93,244,94,244,95,244,96,244,97,244,98,244,99,244,100,244,101,244,102,244,103,244,104,244,105,244,106,244,107,244,108,244,109,244,110,244,111,244,112,244,113,244,114,244,115,244,116,244,117,244,118,244,119,244,120,244,121,244,122,244,123,244,124,244,125,244,126,244,161,244,162,244,163,244,164,244,165,244,166,244,167,244,168,244,169,244,170,244,171,244,172,244,173,244,174,244,175,244,176,244,177,244,178,244,179,244,180,244,181,244,182,244,183,244,184,244,185,244,186,244,187,244,188,244,189,244,190,244,191,244,192,244,193,244,194,244,195,244,196,244,197,244,198,244,199,244,200,244,201,244,202,244,203,244,204,244,205,244,206,244,207,244,208,244,209,244,210,244,211,244,212,244,213,244,214,244,215,244,216,244,217,244,218,244,219,244,220,244,221,244,222,244,223,244,224,244,225,244,226,244,227,244,228,244,229,244,230,244,231,244,232,244,233,244,234,244,235,244,236,244,237,244,238,244,239,244,240,244,241,244,242,244,243,244,244,244,245,244,246,244,247,244,248,244,249,244,250,244,251,244,252,244,253,244,254,245,64,245,65,245,66,245,67,245,68,245,69,245,70,245,71,245,72,245,73,245,74,245,75,245,76,245,77,245,78,245,79,245,80,245,81,245,82,245,83,245,84,245,85,245,86,245,87,245,88,245,89,245,90,245,91,245,92,245,93,245,94,245,95,245,96,245,97,245,98,245,99,245,100,245,101,245,102,245,103,245,104,245,105,245,106,245,107,245,108,245,109,245,110,245,111,245,112,245,113,245,114,245,115,245,116,245,117,245,118,245,119,245,120,245,121,245,122,245,123,245,124,245,125,245,126,245,161,245,162,245,163,245,164,245,165,245,166,245,167,245,168,245,169,245,170,245,171,245,172,245,173,245,174,245,175,245,176,245,177,245,178,245,179,245,180,245,181,245,182,245,183,245,184,245,185,245,186,245,187,245,188,245,189,245,190,245,191,245,192,245,193,245,194,245,195,245,196,245,197,245,198,245,199,245,200,245,201,245,202,245,203,245,204,245,205,245,206,245,207,245,208,245,209,245,210,245,211,245,212,245,213,245,214,245,215,245,216,245,217,245,218,245,219,245,220,245,221,245,222,245,223,245,224,245,225,245,226,245,227,245,228,245,229,245,230,245,231,245,233,245,234,245,235,245,236,245,237,245,238,245,239,245,240,245,241,245,242,245,243,245,244,245,245,245,246,245,247,245,248,245,249,245,250,245,251,245,252,245,253,245,254,246,64,246,65,246,66,246,67,246,68,246,69,246,70,246,71,246,72,246,73,246,74,246,75,246,76,246,77,246,78,246,79,246,80,246,81,246,82,246,83,246,84,246,85,246,86,246,87,246,88,246,89,246,90,246,91,246,92,246,93,246,94,246,95,246,96,246,97,246,98,246,99,246,100,246,101,246,102,246,103,246,104,246,105,246,106,246,107,246,108,246,109,246,110,246,111,246,112,246,113,246,114,246,115,246,116,246,117,246,118,246,119,246,120,246,121,246,122,246,123,246,124,246,125,246,126,246,161,246,162,246,163,246,164,246,165,246,166,246,167,246,168,246,169,246,170,246,171,246,172,246,173,246,174,246,175,246,176,246,177,246,178,246,179,246,180,246,181,246,182,246,183,246,184,246,185,246,186,246,187,246,188,246,189,246,190,246,191,246,192,246,193,246,194,246,195,246,196,246,197,246,198,246,199,246,200,246,201,246,202,246,203,246,204,246,205,246,206,246,207,246,208,246,209,246,210,246,211,246,212,246,213,246,214,246,215,246,216,246,217,246,218,246,219,246,220,246,221,246,222,246,223,246,224,246,225,246,226,246,227,246,228,246,229,246,230,246,231,246,232,246,233,246,234,246,235,246,236,246,237,246,238,246,239,246,240,246,241,246,242,246,243,246,244,246,245,246,246,246,247,246,248,246,249,246,250,246,251,246,252,246,253,246,254,247,64,247,65,247,66,247,67,247,68,247,69,247,70,247,71,247,72,247,73,247,74,247,75,247,76,247,77,247,78,247,79,247,80,247,81,247,82,247,83,247,84,247,85,247,86,247,87,247,88,247,89,247,90,247,91,247,92,247,93,247,94,247,95,247,96,247,97,247,98,247,99,247,100,247,101,247,102,247,103,247,104,247,105,247,106,247,107,247,108,247,109,247,110,247,111,247,112,247,113,247,114,247,115,247,116,247,117,247,118,247,119,247,120,247,121,247,122,247,123,247,124,247,125,247,126,247,161,247,162,247,163,247,164,247,165,247,166,247,167,247,168,247,169,247,170,247,171,247,172,247,173,247,174,247,175,247,176,247,177,247,178,247,179,247,180,247,181,247,182,247,183,247,184,247,185,247,186,247,187,247,188,247,189,247,190,247,191,247,192,247,193,247,194,247,195,247,196,247,197,247,198,247,199,247,200,247,201,247,202,247,203,247,204,247,205,247,206,247,207,247,208,247,209,247,210,247,211,247,212,247,213,247,214,247,215,247,216,247,217,247,218,247,219,247,220,247,221,247,222,247,223,247,224,247,225,247,226,247,227,247,228,247,229,247,230,247,231,247,232,247,233,247,234,247,235,247,236,247,237,247,238,247,239,247,240,247,241,247,242,247,243,247,244,247,245,247,246,247,247,247,248,247,249,247,250,247,251,247,252,247,253,247,254,248,64,248,65,248,66,248,67,248,68,248,69,248,70,248,71,248,72,248,73,248,74,248,75,248,76,248,77,248,78,248,79,248,80,248,81,248,82,248,83,248,84,248,85,248,86,248,87,248,88,248,89,248,90,248,91,248,92,248,93,248,94,248,95,248,96,248,97,248,98,248,99,248,100,248,101,248,102,248,103,248,104,248,105,248,106,248,107,248,108,248,110,248,111,248,112,248,113,248,114,248,115,248,116,248,117,248,118,248,119,248,120,248,121,248,122,248,123,248,124,248,125,248,126,248,161,248,162,248,163,248,164,248,165,248,166,248,167,248,168,248,169,248,170,248,171,248,172,248,173,248,174,248,175,248,176,248,177,248,178,248,179,248,180,248,181,248,182,248,183,248,184,248,185,248,186,248,187,248,188,248,189,248,190,248,191,248,192,248,193,248,194,248,195,248,196,248,197,248,198,248,199,248,200,248,201,248,202,248,203,248,204,248,205,248,206,248,207,248,208,248,209,248,210,248,211,248,212,248,213,248,214,248,215,248,216,248,217,248,218,248,219,248,220,248,221,248,222,248,223,248,224,248,225,248,226,248,227,248,228,248,229,248,230,248,231,248,232,248,233,248,234,248,235,248,236,248,237,248,238,248,239,248,240,248,241,248,242,248,243,248,244,248,245,248,246,248,247,248,248,248,249,248,250,248,251,248,252,248,253,248,254,249,64,249,65,249,66,249,67,249,68,249,69,249,70,249,71,249,72,249,73,249,74,249,75,249,76,249,77,249,78,249,79,249,80,249,81,249,82,249,83,249,84,249,85,249,86,249,87,249,88,249,89,249,90,249,91,249,92,249,93,249,94,249,95,249,96,249,97,249,98,249,99,249,100,249,101,249,102,249,103,249,104,249,105,249,106,249,107,249,108,249,109,249,110,249,111,249,112,249,113,249,114,249,115,249,116,249,117,249,118,249,119,249,120,249,121,249,122,249,123,249,124,249,125,249,126,249,161,249,162,249,163,249,164,249,165,249,166,249,167,249,168,249,169,249,170,249,171,249,172,249,173,249,174,249,175,249,176,249,177,249,178,249,179,249,180,249,181,249,182,249,183,249,184,249,185,249,186,249,187,249,188,249,189,249,190,249,191,249,192,249,193,249,194,249,195,249,197,249,198,249,199,249,200,249,201,249,202,249,203,249,204,249,205,249,206,249,207,249,208,249,209,249,210,249,211,249,212,249,213,162,165,162,166,162,167,162,164,162,126,162,161,162,162,162,163,173,197,176,176,165,93,162,205,173,235,180,64,201,219,216,244,188,181,180,184,167,251,203,88,180,252,180,228,181,78,183,236,162,96,207,241];
+    var string = "\u3000\uFF0C\u3001\u3002\uFF0E\uFF1B\uFF1A\uFF1F\uFF01\uFE30\u2026\u2025\uFE50\uFE52\u00B7\uFE54\uFE55\uFE56\uFE57\uFF5C\u2013\uFE31\u2014\uFE33\u2574\uFE34\uFE4F\uFF08\uFF09\uFE35\uFE36\uFF5B\uFF5D\uFE37\uFE38\u3014\u3015\uFE39\uFE3A\u3010\u3011\uFE3B\uFE3C\u300A\u300B\uFE3D\uFE3E\u3008\u3009\uFE3F\uFE40\u300C\u300D\uFE41\uFE42\u300E\u300F\uFE43\uFE44\uFE59\uFE5A\uFE5B\uFE5C\uFE5D\uFE5E\u2018\u2019\u201C\u201D\u301D\u301E\u2035\u2032\uFF03\uFF06\uFF0A\u203B\u00A7\u3003\u25CB\u25CF\u25B3\u25B2\u25CE\u2606\u2605\u25C7\u25C6\u25A1\u25A0\u25BD\u25BC\u32A3\u2105\uFFE3\uFF3F\u02CD\uFE49\uFE4A\uFE4D\uFE4E\uFE4B\uFE4C\uFE5F\uFE60\uFE61\uFF0B\uFF0D\u00D7\u00F7\u00B1\u221A\uFF1C\uFF1E\uFF1D\u2266\u2267\u2260\u221E\u2252\u2261\uFE62\uFE63\uFE64\uFE65\uFE66\u2229\u222A\u22A5\u2220\u221F\u22BF\u33D2\u33D1\u222B\u222E\u2235\u2234\u2640\u2642\u2191\u2193\u2190\u2192\u2196\u2197\u2199\u2198\u2225\u2223\uFF04\u3012\uFF05\uFF20\u2103\u2109\uFE69\uFE6A\uFE6B\u33D5\u339C\u339D\u339E\u33CE\u33A1\u338E\u338F\u33C4\u00B0\u5161\u5163\u55E7\u74E9\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588\u258F\u258E\u258D\u258C\u258B\u258A\u2589\u253C\u2534\u252C\u2524\u251C\u2594\u2500\u2502\u2595\u250C\u2510\u2514\u2518\u256D\u256E\u2570\u256F\u2550\u255E\u256A\u2561\u25E2\u25E3\u25E5\u25E4\u2571\u2572\u2573\uFF10\uFF11\uFF12\uFF13\uFF14\uFF15\uFF16\uFF17\uFF18\uFF19\u2160\u2161\u2162\u2163\u2164\u2165\u2166\u2167\u2168\u2169\u3021\u3022\u3023\u3024\u3025\u3026\u3027\u3028\u3029\u5344\uFF21\uFF22\uFF23\uFF24\uFF25\uFF26\uFF27\uFF28\uFF29\uFF2A\uFF2B\uFF2C\uFF2D\uFF2E\uFF2F\uFF30\uFF31\uFF32\uFF33\uFF34\uFF35\uFF36\uFF37\uFF38\uFF39\uFF3A\uFF41\uFF42\uFF43\uFF44\uFF45\uFF46\uFF47\uFF48\uFF49\uFF4A\uFF4B\uFF4C\uFF4D\uFF4E\uFF4F\uFF50\uFF51\uFF52\uFF53\uFF54\uFF55\uFF56\uFF57\uFF58\uFF59\uFF5A\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039A\u039B\u039C\u039D\u039E\u039F\u03A0\u03A1\u03A3\u03A4\u03A5\u03A6\u03A7\u03A8\u03A9\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA\u03BB\u03BC\u03BD\u03BE\u03BF\u03C0\u03C1\u03C3\u03C4\u03C5\u03C6\u03C7\u03C8\u03C9\u3105\u3106\u3107\u3108\u3109\u310A\u310B\u310C\u310D\u310E\u310F\u3110\u3111\u3112\u3113\u3114\u3115\u3116\u3117\u3118\u3119\u311A\u311B\u311C\u311D\u311E\u311F\u3120\u3121\u3122\u3123\u3124\u3125\u3126\u3127\u3128\u3129\u02D9\u02C9\u02CA\u02C7\u02CB\u4E00\u4E59\u4E01\u4E03\u4E43\u4E5D\u4E86\u4E8C\u4EBA\u513F\u5165\u516B\u51E0\u5200\u5201\u529B\u5315\u535C\u53C8\u4E09\u4E0B\u4E08\u4E0A\u4E2B\u4E38\u51E1\u4E45\u4E48\u4E5F\u4E5E\u4E8E\u4EA1\u5140\u5203\u52FA\u5343\u53C9\u53E3\u571F\u58EB\u5915\u5927\u5973\u5B50\u5B51\u5B53\u5BF8\u5C0F\u5C22\u5C38\u5C71\u5DDD\u5DE5\u5DF1\u5DF2\u5DF3\u5DFE\u5E72\u5EFE\u5F0B\u5F13\u624D\u4E11\u4E10\u4E0D\u4E2D\u4E30\u4E39\u4E4B\u5C39\u4E88\u4E91\u4E95\u4E92\u4E94\u4EA2\u4EC1\u4EC0\u4EC3\u4EC6\u4EC7\u4ECD\u4ECA\u4ECB\u4EC4\u5143\u5141\u5167\u516D\u516E\u516C\u5197\u51F6\u5206\u5207\u5208\u52FB\u52FE\u52FF\u5316\u5339\u5348\u5347\u535E\u5384\u53CB\u53CA\u53CD\u58EC\u5929\u592B\u592A\u592D\u5B54\u5C11\u5C24\u5C3A\u5C6F\u5DF4\u5E7B\u5EFF\u5F14\u5F15\u5FC3\u6208\u6236\u624B\u624E\u652F\u6587\u6597\u65A4\u65B9\u65E5\u66F0\u6708\u6728\u6B20\u6B62\u6B79\u6BCB\u6BD4\u6BDB\u6C0F\u6C34\u706B\u722A\u7236\u723B\u7247\u7259\u725B\u72AC\u738B\u4E19\u4E16\u4E15\u4E14\u4E18\u4E3B\u4E4D\u4E4F\u4E4E\u4EE5\u4ED8\u4ED4\u4ED5\u4ED6\u4ED7\u4EE3\u4EE4\u4ED9\u4EDE\u5145\u5144\u5189\u518A\u51AC\u51F9\u51FA\u51F8\u520A\u52A0\u529F\u5305\u5306\u5317\u531D\u4EDF\u534A\u5349\u5361\u5360\u536F\u536E\u53BB\u53EF\u53E4\u53F3\u53EC\u53EE\u53E9\u53E8\u53FC\u53F8\u53F5\u53EB\u53E6\u53EA\u53F2\u53F1\u53F0\u53E5\u53ED\u53FB\u56DB\u56DA\u5916\u592E\u5931\u5974\u5976\u5B55\u5B83\u5C3C\u5DE8\u5DE7\u5DE6\u5E02\u5E03\u5E73\u5E7C\u5F01\u5F18\u5F17\u5FC5\u620A\u6253\u6254\u6252\u6251\u65A5\u65E6\u672E\u672C\u672A\u672B\u672D\u6B63\u6BCD\u6C11\u6C10\u6C38\u6C41\u6C40\u6C3E\u72AF\u7384\u7389\u74DC\u74E6\u7518\u751F\u7528\u7529\u7530\u7531\u7532\u7533\u758B\u767D\u76AE\u76BF\u76EE\u77DB\u77E2\u77F3\u793A\u79BE\u7A74\u7ACB\u4E1E\u4E1F\u4E52\u4E53\u4E69\u4E99\u4EA4\u4EA6\u4EA5\u4EFF\u4F09\u4F19\u4F0A\u4F15\u4F0D\u4F10\u4F11\u4F0F\u4EF2\u4EF6\u4EFB\u4EF0\u4EF3\u4EFD\u4F01\u4F0B\u5149\u5147\u5146\u5148\u5168\u5171\u518D\u51B0\u5217\u5211\u5212\u520E\u5216\u52A3\u5308\u5321\u5320\u5370\u5371\u5409\u540F\u540C\u540A\u5410\u5401\u540B\u5404\u5411\u540D\u5408\u5403\u540E\u5406\u5412\u56E0\u56DE\u56DD\u5733\u5730\u5728\u572D\u572C\u572F\u5729\u5919\u591A\u5937\u5938\u5984\u5978\u5983\u597D\u5979\u5982\u5981\u5B57\u5B58\u5B87\u5B88\u5B85\u5B89\u5BFA\u5C16\u5C79\u5DDE\u5E06\u5E76\u5E74\u5F0F\u5F1B\u5FD9\u5FD6\u620E\u620C\u620D\u6210\u6263\u625B\u6258\u6536\u65E9\u65E8\u65EC\u65ED\u66F2\u66F3\u6709\u673D\u6734\u6731\u6735\u6B21\u6B64\u6B7B\u6C16\u6C5D\u6C57\u6C59\u6C5F\u6C60\u6C50\u6C55\u6C61\u6C5B\u6C4D\u6C4E\u7070\u725F\u725D\u767E\u7AF9\u7C73\u7CF8\u7F36\u7F8A\u7FBD\u8001\u8003\u800C\u8012\u8033\u807F\u8089\u808B\u808C\u81E3\u81EA\u81F3\u81FC\u820C\u821B\u821F\u826E\u8272\u827E\u866B\u8840\u884C\u8863\u897F\u9621\u4E32\u4EA8\u4F4D\u4F4F\u4F47\u4F57\u4F5E\u4F34\u4F5B\u4F55\u4F30\u4F50\u4F51\u4F3D\u4F3A\u4F38\u4F43\u4F54\u4F3C\u4F46\u4F63\u4F5C\u4F60\u4F2F\u4F4E\u4F36\u4F59\u4F5D\u4F48\u4F5A\u514C\u514B\u514D\u5175\u51B6\u51B7\u5225\u5224\u5229\u522A\u5228\u52AB\u52A9\u52AA\u52AC\u5323\u5373\u5375\u541D\u542D\u541E\u543E\u5426\u544E\u5427\u5446\u5443\u5433\u5448\u5442\u541B\u5429\u544A\u5439\u543B\u5438\u542E\u5435\u5436\u5420\u543C\u5440\u5431\u542B\u541F\u542C\u56EA\u56F0\u56E4\u56EB\u574A\u5751\u5740\u574D\u5747\u574E\u573E\u5750\u574F\u573B\u58EF\u593E\u599D\u5992\u59A8\u599E\u59A3\u5999\u5996\u598D\u59A4\u5993\u598A\u59A5\u5B5D\u5B5C\u5B5A\u5B5B\u5B8C\u5B8B\u5B8F\u5C2C\u5C40\u5C41\u5C3F\u5C3E\u5C90\u5C91\u5C94\u5C8C\u5DEB\u5E0C\u5E8F\u5E87\u5E8A\u5EF7\u5F04\u5F1F\u5F64\u5F62\u5F77\u5F79\u5FD8\u5FCC\u5FD7\u5FCD\u5FF1\u5FEB\u5FF8\u5FEA\u6212\u6211\u6284\u6297\u6296\u6280\u6276\u6289\u626D\u628A\u627C\u627E\u6279\u6273\u6292\u626F\u6298\u626E\u6295\u6293\u6291\u6286\u6539\u653B\u6538\u65F1\u66F4\u675F\u674E\u674F\u6750\u6751\u675C\u6756\u675E\u6749\u6746\u6760\u6753\u6757\u6B65\u6BCF\u6C42\u6C5E\u6C99\u6C81\u6C88\u6C89\u6C85\u6C9B\u6C6A\u6C7A\u6C90\u6C70\u6C8C\u6C68\u6C96\u6C92\u6C7D\u6C83\u6C72\u6C7E\u6C74\u6C86\u6C76\u6C8D\u6C94\u6C98\u6C82\u7076\u707C\u707D\u7078\u7262\u7261\u7260\u72C4\u72C2\u7396\u752C\u752B\u7537\u7538\u7682\u76EF\u77E3\u79C1\u79C0\u79BF\u7A76\u7CFB\u7F55\u8096\u8093\u809D\u8098\u809B\u809A\u80B2\u826F\u8292\u828B\u828D\u898B\u89D2\u8A00\u8C37\u8C46\u8C55\u8C9D\u8D64\u8D70\u8DB3\u8EAB\u8ECA\u8F9B\u8FB0\u8FC2\u8FC6\u8FC5\u8FC4\u5DE1\u9091\u90A2\u90AA\u90A6\u90A3\u9149\u91C6\u91CC\u9632\u962E\u9631\u962A\u962C\u4E26\u4E56\u4E73\u4E8B\u4E9B\u4E9E\u4EAB\u4EAC\u4F6F\u4F9D\u4F8D\u4F73\u4F7F\u4F6C\u4F9B\u4F8B\u4F86\u4F83\u4F70\u4F75\u4F88\u4F69\u4F7B\u4F96\u4F7E\u4F8F\u4F91\u4F7A\u5154\u5152\u5155\u5169\u5177\u5176\u5178\u51BD\u51FD\u523B\u5238\u5237\u523A\u5230\u522E\u5236\u5241\u52BE\u52BB\u5352\u5354\u5353\u5351\u5366\u5377\u5378\u5379\u53D6\u53D4\u53D7\u5473\u5475\u5496\u5478\u5495\u5480\u547B\u5477\u5484\u5492\u5486\u547C\u5490\u5471\u5476\u548C\u549A\u5462\u5468\u548B\u547D\u548E\u56FA\u5783\u5777\u576A\u5769\u5761\u5766\u5764\u577C\u591C\u5949\u5947\u5948\u5944\u5954\u59BE\u59BB\u59D4\u59B9\u59AE\u59D1\u59C6\u59D0\u59CD\u59CB\u59D3\u59CA\u59AF\u59B3\u59D2\u59C5\u5B5F\u5B64\u5B63\u5B97\u5B9A\u5B98\u5B9C\u5B99\u5B9B\u5C1A\u5C48\u5C45\u5C46\u5CB7\u5CA1\u5CB8\u5CA9\u5CAB\u5CB1\u5CB3\u5E18\u5E1A\u5E16\u5E15\u5E1B\u5E11\u5E78\u5E9A\u5E97\u5E9C\u5E95\u5E96\u5EF6\u5F26\u5F27\u5F29\u5F80\u5F81\u5F7F\u5F7C\u5FDD\u5FE0\u5FFD\u5FF5\u5FFF\u600F\u6014\u602F\u6035\u6016\u602A\u6015\u6021\u6027\u6029\u602B\u601B\u6216\u6215\u623F\u623E\u6240\u627F\u62C9\u62CC\u62C4\u62BF\u62C2\u62B9\u62D2\u62DB\u62AB\u62D3\u62D4\u62CB\u62C8\u62A8\u62BD\u62BC\u62D9\u62C7\u62CD\u62B5\u62DA\u62B1\u62D8\u62D6\u62D7\u62C6\u62AC\u653E\u65A7\u65BC\u65FA\u6614\u6613\u660C\u6606\u6602\u660E\u6600\u660F\u6615\u660A\u6607\u670D\u670B\u676D\u678B\u6795\u6771\u679C\u6773\u6777\u6787\u679D\u6797\u676F\u6770\u677F\u6789\u677E\u6790\u6775\u679A\u6793\u677C\u676A\u6772\u6B23\u6B66\u6B67\u6B7F\u6C13\u6C1B\u6CE3\u6CE8\u6CF3\u6CB1\u6CCC\u6CE5\u6CB3\u6CBD\u6CBE\u6CBC\u6CE2\u6CAB\u6CD5\u6CD3\u6CB8\u6CC4\u6CB9\u6CC1\u6CAE\u6CD7\u6CC5\u6CF1\u6CBF\u6CBB\u6CE1\u6CDB\u6CCA\u6CAC\u6CEF\u6CDC\u6CD6\u6CE0\u7095\u708E\u7092\u708A\u7099\u722C\u722D\u7238\u7248\u7267\u7269\u72C0\u72CE\u72D9\u72D7\u72D0\u73A9\u73A8\u739F\u73AB\u73A5\u753D\u759D\u7599\u759A\u7684\u76C2\u76F2\u76F4\u77E5\u77FD\u793E\u7940\u7941\u79C9\u79C8\u7A7A\u7A79\u7AFA\u7CFE\u7F54\u7F8C\u7F8B\u80BA\u80A5\u80A2\u80B1\u80A1\u80AB\u80A9\u80B4\u80AA\u80AF\u81E5\u81FE\u820D\u82B3\u829D\u8299\u82AD\u82BD\u829F\u82B9\u82B1\u82AC\u82A5\u82AF\u82B8\u82A3\u82B0\u82BE\u82B7\u864E\u8671\u521D\u8868\u8ECB\u8FCE\u8FD4\u8FD1\u90B5\u90B8\u90B1\u90B6\u91C7\u91D1\u9577\u9580\u961C\u9640\u963F\u963B\u9644\u9642\u96B9\u96E8\u9752\u975E\u4E9F\u4EAD\u4EAE\u4FE1\u4FB5\u4FAF\u4FBF\u4FE0\u4FD1\u4FCF\u4FDD\u4FC3\u4FB6\u4FD8\u4FDF\u4FCA\u4FD7\u4FAE\u4FD0\u4FC4\u4FC2\u4FDA\u4FCE\u4FDE\u4FB7\u5157\u5192\u5191\u51A0\u524E\u5243\u524A\u524D\u524C\u524B\u5247\u52C7\u52C9\u52C3\u52C1\u530D\u5357\u537B\u539A\u53DB\u54AC\u54C0\u54A8\u54CE\u54C9\u54B8\u54A6\u54B3\u54C7\u54C2\u54BD\u54AA\u54C1\u54C4\u54C8\u54AF\u54AB\u54B1\u54BB\u54A9\u54A7\u54BF\u56FF\u5782\u578B\u57A0\u57A3\u57A2\u57CE\u57AE\u5793\u5955\u5951\u594F\u594E\u5950\u59DC\u59D8\u59FF\u59E3\u59E8\u5A03\u59E5\u59EA\u59DA\u59E6\u5A01\u59FB\u5B69\u5BA3\u5BA6\u5BA4\u5BA2\u5BA5\u5C01\u5C4E\u5C4F\u5C4D\u5C4B\u5CD9\u5CD2\u5DF7\u5E1D\u5E25\u5E1F\u5E7D\u5EA0\u5EA6\u5EFA\u5F08\u5F2D\u5F65\u5F88\u5F85\u5F8A\u5F8B\u5F87\u5F8C\u5F89\u6012\u601D\u6020\u6025\u600E\u6028\u604D\u6070\u6068\u6046\u6043\u606C\u606B\u606A\u6064\u6241\u62DC\u6316\u6309\u62FC\u62ED\u6301\u62EE\u62FD\u6307\u62F1\u62F7\u62EF\u62EC\u62FE\u62F4\u6311\u6302\u653F\u6545\u65AB\u65BD\u65E2\u6625\u662D\u6620\u6627\u662F\u661F\u6628\u6631\u6624\u66F7\u67FF\u67D3\u67F1\u67D4\u67D0\u67EC\u67B6\u67AF\u67F5\u67E9\u67EF\u67C4\u67D1\u67B4\u67DA\u67E5\u67B8\u67CF\u67DE\u67F3\u67B0\u67D9\u67E2\u67DD\u67D2\u6B6A\u6B83\u6B86\u6BB5\u6BD2\u6BD7\u6C1F\u6CC9\u6D0B\u6D32\u6D2A\u6D41\u6D25\u6D0C\u6D31\u6D1E\u6D17\u6D3B\u6D3D\u6D3E\u6D36\u6D1B\u6CF5\u6D39\u6D27\u6D38\u6D29\u6D2E\u6D35\u6D0E\u6D2B\u70AB\u70BA\u70B3\u70AC\u70AF\u70AD\u70B8\u70AE\u70A4\u7230\u7272\u726F\u7274\u72E9\u72E0\u72E1\u73B7\u73CA\u73BB\u73B2\u73CD\u73C0\u73B3\u751A\u752D\u754F\u754C\u754E\u754B\u75AB\u75A4\u75A5\u75A2\u75A3\u7678\u7686\u7687\u7688\u76C8\u76C6\u76C3\u76C5\u7701\u76F9\u76F8\u7709\u770B\u76FE\u76FC\u7707\u77DC\u7802\u7814\u780C\u780D\u7946\u7949\u7948\u7947\u79B9\u79BA\u79D1\u79D2\u79CB\u7A7F\u7A81\u7AFF\u7AFD\u7C7D\u7D02\u7D05\u7D00\u7D09\u7D07\u7D04\u7D06\u7F38\u7F8E\u7FBF\u8004\u8010\u800D\u8011\u8036\u80D6\u80E5\u80DA\u80C3\u80C4\u80CC\u80E1\u80DB\u80CE\u80DE\u80E4\u80DD\u81F4\u8222\u82E7\u8303\u8305\u82E3\u82DB\u82E6\u8304\u82E5\u8302\u8309\u82D2\u82D7\u82F1\u8301\u82DC\u82D4\u82D1\u82DE\u82D3\u82DF\u82EF\u8306\u8650\u8679\u867B\u867A\u884D\u886B\u8981\u89D4\u8A08\u8A02\u8A03\u8C9E\u8CA0\u8D74\u8D73\u8DB4\u8ECD\u8ECC\u8FF0\u8FE6\u8FE2\u8FEA\u8FE5\u8FED\u8FEB\u8FE4\u8FE8\u90CA\u90CE\u90C1\u90C3\u914B\u914A\u91CD\u9582\u9650\u964B\u964C\u964D\u9762\u9769\u97CB\u97ED\u97F3\u9801\u98A8\u98DB\u98DF\u9996\u9999\u4E58\u4EB3\u500C\u500D\u5023\u4FEF\u5026\u5025\u4FF8\u5029\u5016\u5006\u503C\u501F\u501A\u5012\u5011\u4FFA\u5000\u5014\u5028\u4FF1\u5021\u500B\u5019\u5018\u4FF3\u4FEE\u502D\u502A\u4FFE\u502B\u5009\u517C\u51A4\u51A5\u51A2\u51CD\u51CC\u51C6\u51CB\u5256\u525C\u5254\u525B\u525D\u532A\u537F\u539F\u539D\u53DF\u54E8\u5510\u5501\u5537\u54FC\u54E5\u54F2\u5506\u54FA\u5514\u54E9\u54ED\u54E1\u5509\u54EE\u54EA\u54E6\u5527\u5507\u54FD\u550F\u5703\u5704\u57C2\u57D4\u57CB\u57C3\u5809\u590F\u5957\u5958\u595A\u5A11\u5A18\u5A1C\u5A1F\u5A1B\u5A13\u59EC\u5A20\u5A23\u5A29\u5A25\u5A0C\u5A09\u5B6B\u5C58\u5BB0\u5BB3\u5BB6\u5BB4\u5BAE\u5BB5\u5BB9\u5BB8\u5C04\u5C51\u5C55\u5C50\u5CED\u5CFD\u5CFB\u5CEA\u5CE8\u5CF0\u5CF6\u5D01\u5CF4\u5DEE\u5E2D\u5E2B\u5EAB\u5EAD\u5EA7\u5F31\u5F92\u5F91\u5F90\u6059\u6063\u6065\u6050\u6055\u606D\u6069\u606F\u6084\u609F\u609A\u608D\u6094\u608C\u6085\u6096\u6247\u62F3\u6308\u62FF\u634E\u633E\u632F\u6355\u6342\u6346\u634F\u6349\u633A\u6350\u633D\u632A\u632B\u6328\u634D\u634C\u6548\u6549\u6599\u65C1\u65C5\u6642\u6649\u664F\u6643\u6652\u664C\u6645\u6641\u66F8\u6714\u6715\u6717\u6821\u6838\u6848\u6846\u6853\u6839\u6842\u6854\u6829\u68B3\u6817\u684C\u6851\u683D\u67F4\u6850\u6840\u683C\u6843\u682A\u6845\u6813\u6818\u6841\u6B8A\u6B89\u6BB7\u6C23\u6C27\u6C28\u6C26\u6C24\u6CF0\u6D6A\u6D95\u6D88\u6D87\u6D66\u6D78\u6D77\u6D59\u6D93\u6D6C\u6D89\u6D6E\u6D5A\u6D74\u6D69\u6D8C\u6D8A\u6D79\u6D85\u6D65\u6D94\u70CA\u70D8\u70E4\u70D9\u70C8\u70CF\u7239\u7279\u72FC\u72F9\u72FD\u72F8\u72F7\u7386\u73ED\u7409\u73EE\u73E0\u73EA\u73DE\u7554\u755D\u755C\u755A\u7559\u75BE\u75C5\u75C7\u75B2\u75B3\u75BD\u75BC\u75B9\u75C2\u75B8\u768B\u76B0\u76CA\u76CD\u76CE\u7729\u771F\u7720\u7728\u77E9\u7830\u7827\u7838\u781D\u7834\u7837\u7825\u782D\u7820\u781F\u7832\u7955\u7950\u7960\u795F\u7956\u795E\u795D\u7957\u795A\u79E4\u79E7\u79DF\u79E6\u79E9\u79D8\u7A84\u7A88\u7AD9\u7B06\u7B11\u7C89\u7D21\u7D17\u7D0B\u7D0A\u7D20\u7D22\u7D14\u7D10\u7D15\u7D1A\u7D1C\u7D0D\u7D19\u7D1B\u7F3A\u7F5F\u7F94\u7FC5\u7FC1\u8006\u8018\u8015\u8019\u8017\u803D\u803F\u80F1\u8102\u80F0\u8105\u80ED\u80F4\u8106\u80F8\u80F3\u8108\u80FD\u810A\u80FC\u80EF\u81ED\u81EC\u8200\u8210\u822A\u822B\u8228\u822C\u82BB\u832B\u8352\u8354\u834A\u8338\u8350\u8349\u8335\u8334\u834F\u8332\u8339\u8336\u8317\u8340\u8331\u8328\u8343\u8654\u868A\u86AA\u8693\u86A4\u86A9\u868C\u86A3\u869C\u8870\u8877\u8881\u8882\u887D\u8879\u8A18\u8A10\u8A0E\u8A0C\u8A15\u8A0A\u8A17\u8A13\u8A16\u8A0F\u8A11\u8C48\u8C7A\u8C79\u8CA1\u8CA2\u8EAC\u8ED2\u8ED4\u8ECF\u8FB1\u9001\u9006\u8FF7\u9000\u8FFA\u8FF4\u9003\u8FFD\u9005\u8FF8\u9095\u90E1\u90DD\u90E2\u9152\u914D\u914C\u91D8\u91DD\u91D7\u91DC\u91D9\u9583\u9662\u9663\u9661\u965B\u965D\u9664\u9658\u965E\u96BB\u98E2\u99AC\u9AA8\u9AD8\u9B25\u9B32\u9B3C\u4E7E\u507A\u507D\u505C\u5047\u5043\u504C\u505A\u5049\u5065\u5076\u504E\u5055\u5075\u5074\u5077\u504F\u500F\u506F\u506D\u515C\u5195\u51F0\u526A\u526F\u52D2\u52D9\u52D8\u52D5\u5310\u530F\u5319\u533F\u5340\u533E\u53C3\u66FC\u5546\u556A\u5566\u5544\u555E\u5561\u5543\u554A\u5531\u5556\u554F\u5555\u552F\u5564\u5538\u552E\u555C\u552C\u5563\u5533\u5541\u5557\u5708\u570B\u5709\u57DF\u5805\u580A\u5806\u57E0\u57E4\u57FA\u5802\u5835\u57F7\u57F9\u5920\u5962\u5A36\u5A41\u5A49\u5A66\u5A6A\u5A40\u5A3C\u5A62\u5A5A\u5A46\u5A4A\u5B70\u5BC7\u5BC5\u5BC4\u5BC2\u5BBF\u5BC6\u5C09\u5C08\u5C07\u5C60\u5C5C\u5C5D\u5D07\u5D06\u5D0E\u5D1B\u5D16\u5D22\u5D11\u5D29\u5D14\u5D19\u5D24\u5D27\u5D17\u5DE2\u5E38\u5E36\u5E33\u5E37\u5EB7\u5EB8\u5EB6\u5EB5\u5EBE\u5F35\u5F37\u5F57\u5F6C\u5F69\u5F6B\u5F97\u5F99\u5F9E\u5F98\u5FA1\u5FA0\u5F9C\u607F\u60A3\u6089\u60A0\u60A8\u60CB\u60B4\u60E6\u60BD\u60C5\u60BB\u60B5\u60DC\u60BC\u60D8\u60D5\u60C6\u60DF\u60B8\u60DA\u60C7\u621A\u621B\u6248\u63A0\u63A7\u6372\u6396\u63A2\u63A5\u6377\u6367\u6398\u63AA\u6371\u63A9\u6389\u6383\u639B\u636B\u63A8\u6384\u6388\u6399\u63A1\u63AC\u6392\u638F\u6380\u637B\u6369\u6368\u637A\u655D\u6556\u6551\u6559\u6557\u555F\u654F\u6558\u6555\u6554\u659C\u659B\u65AC\u65CF\u65CB\u65CC\u65CE\u665D\u665A\u6664\u6668\u6666\u665E\u66F9\u52D7\u671B\u6881\u68AF\u68A2\u6893\u68B5\u687F\u6876\u68B1\u68A7\u6897\u68B0\u6883\u68C4\u68AD\u6886\u6885\u6894\u689D\u68A8\u689F\u68A1\u6882\u6B32\u6BBA\u6BEB\u6BEC\u6C2B\u6D8E\u6DBC\u6DF3\u6DD9\u6DB2\u6DE1\u6DCC\u6DE4\u6DFB\u6DFA\u6E05\u6DC7\u6DCB\u6DAF\u6DD1\u6DAE\u6DDE\u6DF9\u6DB8\u6DF7\u6DF5\u6DC5\u6DD2\u6E1A\u6DB5\u6DDA\u6DEB\u6DD8\u6DEA\u6DF1\u6DEE\u6DE8\u6DC6\u6DC4\u6DAA\u6DEC\u6DBF\u6DE6\u70F9\u7109\u710A\u70FD\u70EF\u723D\u727D\u7281\u731C\u731B\u7316\u7313\u7319\u7387\u7405\u740A\u7403\u7406\u73FE\u740D\u74E0\u74F6\u74F7\u751C\u7522\u7565\u7566\u7562\u7570\u758F\u75D4\u75D5\u75B5\u75CA\u75CD\u768E\u76D4\u76D2\u76DB\u7737\u773E\u773C\u7736\u7738\u773A\u786B\u7843\u784E\u7965\u7968\u796D\u79FB\u7A92\u7A95\u7B20\u7B28\u7B1B\u7B2C\u7B26\u7B19\u7B1E\u7B2E\u7C92\u7C97\u7C95\u7D46\u7D43\u7D71\u7D2E\u7D39\u7D3C\u7D40\u7D30\u7D33\u7D44\u7D2F\u7D42\u7D32\u7D31\u7F3D\u7F9E\u7F9A\u7FCC\u7FCE\u7FD2\u801C\u804A\u8046\u812F\u8116\u8123\u812B\u8129\u8130\u8124\u8202\u8235\u8237\u8236\u8239\u838E\u839E\u8398\u8378\u83A2\u8396\u83BD\u83AB\u8392\u838A\u8393\u8389\u83A0\u8377\u837B\u837C\u8386\u83A7\u8655\u5F6A\u86C7\u86C0\u86B6\u86C4\u86B5\u86C6\u86CB\u86B1\u86AF\u86C9\u8853\u889E\u8888\u88AB\u8892\u8896\u888D\u888B\u8993\u898F\u8A2A\u8A1D\u8A23\u8A25\u8A31\u8A2D\u8A1F\u8A1B\u8A22\u8C49\u8C5A\u8CA9\u8CAC\u8CAB\u8CA8\u8CAA\u8CA7\u8D67\u8D66\u8DBE\u8DBA\u8EDB\u8EDF\u9019\u900D\u901A\u9017\u9023\u901F\u901D\u9010\u9015\u901E\u9020\u900F\u9022\u9016\u901B\u9014\u90E8\u90ED\u9157\u91CE\u91F5\u91E6\u91E3\u91E7\u91ED\u91E9\u9589\u966A\u9675\u9673\u9678\u9670\u9674\u9676\u9677\u966C\u96C0\u96EA\u96E9\u7AE0\u7ADF\u9802\u9803\u9B5A\u9CE5\u9E75\u9E7F\u9EA5\u9EBB\u50A2\u508D\u5085\u5099\u5091\u5080\u5096\u5098\u509A\u6700\u51F1\u5272\u5274\u5275\u5269\u52DE\u52DD\u52DB\u535A\u53A5\u557B\u5580\u55A7\u557C\u558A\u559D\u5598\u5582\u559C\u55AA\u5594\u5587\u558B\u5583\u55B3\u55AE\u559F\u553E\u55B2\u559A\u55BB\u55AC\u55B1\u557E\u5589\u55AB\u5599\u570D\u582F\u582A\u5834\u5824\u5830\u5831\u5821\u581D\u5820\u58F9\u58FA\u5960\u5A77\u5A9A\u5A7F\u5A92\u5A9B\u5AA7\u5B73\u5B71\u5BD2\u5BCC\u5BD3\u5BD0\u5C0A\u5C0B\u5C31\u5D4C\u5D50\u5D34\u5D47\u5DFD\u5E45\u5E3D\u5E40\u5E43\u5E7E\u5ECA\u5EC1\u5EC2\u5EC4\u5F3C\u5F6D\u5FA9\u5FAA\u5FA8\u60D1\u60E1\u60B2\u60B6\u60E0\u611C\u6123\u60FA\u6115\u60F0\u60FB\u60F4\u6168\u60F1\u610E\u60F6\u6109\u6100\u6112\u621F\u6249\u63A3\u638C\u63CF\u63C0\u63E9\u63C9\u63C6\u63CD\u63D2\u63E3\u63D0\u63E1\u63D6\u63ED\u63EE\u6376\u63F4\u63EA\u63DB\u6452\u63DA\u63F9\u655E\u6566\u6562\u6563\u6591\u6590\u65AF\u666E\u6670\u6674\u6676\u666F\u6691\u667A\u667E\u6677\u66FE\u66FF\u671F\u671D\u68FA\u68D5\u68E0\u68D8\u68D7\u6905\u68DF\u68F5\u68EE\u68E7\u68F9\u68D2\u68F2\u68E3\u68CB\u68CD\u690D\u6912\u690E\u68C9\u68DA\u696E\u68FB\u6B3E\u6B3A\u6B3D\u6B98\u6B96\u6BBC\u6BEF\u6C2E\u6C2F\u6C2C\u6E2F\u6E38\u6E54\u6E21\u6E32\u6E67\u6E4A\u6E20\u6E25\u6E23\u6E1B\u6E5B\u6E58\u6E24\u6E56\u6E6E\u6E2D\u6E26\u6E6F\u6E34\u6E4D\u6E3A\u6E2C\u6E43\u6E1D\u6E3E\u6ECB\u6E89\u6E19\u6E4E\u6E63\u6E44\u6E72\u6E69\u6E5F\u7119\u711A\u7126\u7130\u7121\u7136\u716E\u711C\u724C\u7284\u7280\u7336\u7325\u7334\u7329\u743A\u742A\u7433\u7422\u7425\u7435\u7436\u7434\u742F\u741B\u7426\u7428\u7525\u7526\u756B\u756A\u75E2\u75DB\u75E3\u75D9\u75D8\u75DE\u75E0\u767B\u767C\u7696\u7693\u76B4\u76DC\u774F\u77ED\u785D\u786C\u786F\u7A0D\u7A08\u7A0B\u7A05\u7A00\u7A98\u7A97\u7A96\u7AE5\u7AE3\u7B49\u7B56\u7B46\u7B50\u7B52\u7B54\u7B4D\u7B4B\u7B4F\u7C9F\u7CA5\u7D5E\u7D50\u7D68\u7D55\u7D2B\u7D6E\u7D72\u7D61\u7D66\u7D62\u7D70\u7D73\u5584\u7FD4\u7FD5\u800B\u8052\u8085\u8155\u8154\u814B\u8151\u814E\u8139\u8146\u813E\u814C\u8153\u8174\u8212\u821C\u83E9\u8403\u83F8\u840D\u83E0\u83C5\u840B\u83EF\u83F1\u83F4\u8457\u840A\u83F0\u840C\u83CC\u83FD\u83F2\u83CA\u8438\u840E\u8404\u83DC\u8407\u83D4\u83DF\u865B\u86DF\u86D9\u86ED\u86D4\u86DB\u86E4\u86D0\u86DE\u8857\u88C1\u88C2\u88B1\u8983\u8996\u8A3B\u8A60\u8A55\u8A5E\u8A3C\u8A41\u8A54\u8A5B\u8A50\u8A46\u8A34\u8A3A\u8A36\u8A56\u8C61\u8C82\u8CAF\u8CBC\u8CB3\u8CBD\u8CC1\u8CBB\u8CC0\u8CB4\u8CB7\u8CB6\u8CBF\u8CB8\u8D8A\u8D85\u8D81\u8DCE\u8DDD\u8DCB\u8DDA\u8DD1\u8DCC\u8DDB\u8DC6\u8EFB\u8EF8\u8EFC\u8F9C\u902E\u9035\u9031\u9038\u9032\u9036\u9102\u90F5\u9109\u90FE\u9163\u9165\u91CF\u9214\u9215\u9223\u9209\u921E\u920D\u9210\u9207\u9211\u9594\u958F\u958B\u9591\u9593\u9592\u958E\u968A\u968E\u968B\u967D\u9685\u9686\u968D\u9672\u9684\u96C1\u96C5\u96C4\u96C6\u96C7\u96EF\u96F2\u97CC\u9805\u9806\u9808\u98E7\u98EA\u98EF\u98E9\u98F2\u98ED\u99AE\u99AD\u9EC3\u9ECD\u9ED1\u4E82\u50AD\u50B5\u50B2\u50B3\u50C5\u50BE\u50AC\u50B7\u50BB\u50AF\u50C7\u527F\u5277\u527D\u52DF\u52E6\u52E4\u52E2\u52E3\u532F\u55DF\u55E8\u55D3\u55E6\u55CE\u55DC\u55C7\u55D1\u55E3\u55E4\u55EF\u55DA\u55E1\u55C5\u55C6\u55E5\u55C9\u5712\u5713\u585E\u5851\u5858\u5857\u585A\u5854\u586B\u584C\u586D\u584A\u5862\u5852\u584B\u5967\u5AC1\u5AC9\u5ACC\u5ABE\u5ABD\u5ABC\u5AB3\u5AC2\u5AB2\u5D69\u5D6F\u5E4C\u5E79\u5EC9\u5EC8\u5F12\u5F59\u5FAC\u5FAE\u611A\u610F\u6148\u611F\u60F3\u611B\u60F9\u6101\u6108\u614E\u614C\u6144\u614D\u613E\u6134\u6127\u610D\u6106\u6137\u6221\u6222\u6413\u643E\u641E\u642A\u642D\u643D\u642C\u640F\u641C\u6414\u640D\u6436\u6416\u6417\u6406\u656C\u659F\u65B0\u6697\u6689\u6687\u6688\u6696\u6684\u6698\u668D\u6703\u6994\u696D\u695A\u6977\u6960\u6954\u6975\u6930\u6982\u694A\u6968\u696B\u695E\u6953\u6979\u6986\u695D\u6963\u695B\u6B47\u6B72\u6BC0\u6BBF\u6BD3\u6BFD\u6EA2\u6EAF\u6ED3\u6EB6\u6EC2\u6E90\u6E9D\u6EC7\u6EC5\u6EA5\u6E98\u6EBC\u6EBA\u6EAB\u6ED1\u6E96\u6E9C\u6EC4\u6ED4\u6EAA\u6EA7\u6EB4\u714E\u7159\u7169\u7164\u7149\u7167\u715C\u716C\u7166\u714C\u7165\u715E\u7146\u7168\u7156\u723A\u7252\u7337\u7345\u733F\u733E\u746F\u745A\u7455\u745F\u745E\u7441\u743F\u7459\u745B\u745C\u7576\u7578\u7600\u75F0\u7601\u75F2\u75F1\u75FA\u75FF\u75F4\u75F3\u76DE\u76DF\u775B\u776B\u7766\u775E\u7763\u7779\u776A\u776C\u775C\u7765\u7768\u7762\u77EE\u788E\u78B0\u7897\u7898\u788C\u7889\u787C\u7891\u7893\u787F\u797A\u797F\u7981\u842C\u79BD\u7A1C\u7A1A\u7A20\u7A14\u7A1F\u7A1E\u7A9F\u7AA0\u7B77\u7BC0\u7B60\u7B6E\u7B67\u7CB1\u7CB3\u7CB5\u7D93\u7D79\u7D91\u7D81\u7D8F\u7D5B\u7F6E\u7F69\u7F6A\u7F72\u7FA9\u7FA8\u7FA4\u8056\u8058\u8086\u8084\u8171\u8170\u8178\u8165\u816E\u8173\u816B\u8179\u817A\u8166\u8205\u8247\u8482\u8477\u843D\u8431\u8475\u8466\u846B\u8449\u846C\u845B\u843C\u8435\u8461\u8463\u8469\u846D\u8446\u865E\u865C\u865F\u86F9\u8713\u8708\u8707\u8700\u86FE\u86FB\u8702\u8703\u8706\u870A\u8859\u88DF\u88D4\u88D9\u88DC\u88D8\u88DD\u88E1\u88CA\u88D5\u88D2\u899C\u89E3\u8A6B\u8A72\u8A73\u8A66\u8A69\u8A70\u8A87\u8A7C\u8A63\u8AA0\u8A71\u8A85\u8A6D\u8A62\u8A6E\u8A6C\u8A79\u8A7B\u8A3E\u8A68\u8C62\u8C8A\u8C89\u8CCA\u8CC7\u8CC8\u8CC4\u8CB2\u8CC3\u8CC2\u8CC5\u8DE1\u8DDF\u8DE8\u8DEF\u8DF3\u8DFA\u8DEA\u8DE4\u8DE6\u8EB2\u8F03\u8F09\u8EFE\u8F0A\u8F9F\u8FB2\u904B\u904A\u9053\u9042\u9054\u903C\u9055\u9050\u9047\u904F\u904E\u904D\u9051\u903E\u9041\u9112\u9117\u916C\u916A\u9169\u91C9\u9237\u9257\u9238\u923D\u9240\u923E\u925B\u924B\u9264\u9251\u9234\u9249\u924D\u9245\u9239\u923F\u925A\u9598\u9698\u9694\u9695\u96CD\u96CB\u96C9\u96CA\u96F7\u96FB\u96F9\u96F6\u9756\u9774\u9776\u9810\u9811\u9813\u980A\u9812\u980C\u98FC\u98F4\u98FD\u98FE\u99B3\u99B1\u99B4\u9AE1\u9CE9\u9E82\u9F0E\u9F13\u9F20\u50E7\u50EE\u50E5\u50D6\u50DA\u50D5\u50CF\u50D1\u50F1\u50CE\u50E9\u5162\u51F3\u5283\u5282\u5331\u53AD\u55FE\u5600\u561B\u5617\u55FD\u5614\u5606\u5609\u560D\u560E\u55F7\u5616\u561F\u5608\u5610\u55F6\u5718\u5716\u5875\u587E\u5883\u5893\u588A\u5879\u5885\u587D\u58FD\u5925\u5922\u5924\u596A\u5969\u5AE1\u5AE6\u5AE9\u5AD7\u5AD6\u5AD8\u5AE3\u5B75\u5BDE\u5BE7\u5BE1\u5BE5\u5BE6\u5BE8\u5BE2\u5BE4\u5BDF\u5C0D\u5C62\u5D84\u5D87\u5E5B\u5E63\u5E55\u5E57\u5E54\u5ED3\u5ED6\u5F0A\u5F46\u5F70\u5FB9\u6147\u613F\u614B\u6177\u6162\u6163\u615F\u615A\u6158\u6175\u622A\u6487\u6458\u6454\u64A4\u6478\u645F\u647A\u6451\u6467\u6434\u646D\u647B\u6572\u65A1\u65D7\u65D6\u66A2\u66A8\u669D\u699C\u69A8\u6995\u69C1\u69AE\u69D3\u69CB\u699B\u69B7\u69BB\u69AB\u69B4\u69D0\u69CD\u69AD\u69CC\u69A6\u69C3\u69A3\u6B49\u6B4C\u6C33\u6F33\u6F14\u6EFE\u6F13\u6EF4\u6F29\u6F3E\u6F20\u6F2C\u6F0F\u6F02\u6F22\u6EFF\u6EEF\u6F06\u6F31\u6F38\u6F32\u6F23\u6F15\u6F2B\u6F2F\u6F88\u6F2A\u6EEC\u6F01\u6EF2\u6ECC\u6EF7\u7194\u7199\u717D\u718A\u7184\u7192\u723E\u7292\u7296\u7344\u7350\u7464\u7463\u746A\u7470\u746D\u7504\u7591\u7627\u760D\u760B\u7609\u7613\u76E1\u76E3\u7784\u777D\u777F\u7761\u78C1\u789F\u78A7\u78B3\u78A9\u78A3\u798E\u798F\u798D\u7A2E\u7A31\u7AAA\u7AA9\u7AED\u7AEF\u7BA1\u7B95\u7B8B\u7B75\u7B97\u7B9D\u7B94\u7B8F\u7B87\u7B84\u7CB9\u7CBD\u7CBE\u7DBB\u7DB0\u7D9C\u7DBD\u7DBE\u7DA0\u7DCA\u7DB4\u7DB2\u7DB1\u7DBA\u7DA2\u7DBF\u7DB5\u7DB8\u7DAD\u7DC7\u7DAC\u7F70\u7FE0\u7FE1\u7FDF\u805E\u805A\u8087\u8150\u8180\u818F\u8188\u818A\u817F\u8182\u81E7\u81FA\u8207\u8214\u821E\u824B\u84C9\u84BF\u84C6\u84C4\u8499\u849E\u84B2\u849C\u84CB\u84B8\u84C0\u84D3\u8490\u84BC\u84D1\u84CA\u873F\u871C\u873B\u8722\u8725\u8734\u8718\u8755\u8737\u8729\u88F3\u8902\u88F4\u88F9\u88F8\u88FD\u88E8\u891A\u88EF\u8AA6\u8A8C\u8A9E\u8AA3\u8A8D\u8AA1\u8A93\u8AA4\u8AAA\u8AA5\u8AA8\u8A98\u8A91\u8A9A\u8AA7\u8C6A\u8C8D\u8C8C\u8CD3\u8CD1\u8CD2\u8D6B\u8D99\u8D95\u8DFC\u8F14\u8F12\u8F15\u8F13\u8FA3\u9060\u9058\u905C\u9063\u9059\u905E\u9062\u905D\u905B\u9119\u9118\u911E\u9175\u9178\u9177\u9174\u9278\u9280\u9285\u9298\u9296\u927B\u9293\u929C\u92A8\u927C\u9291\u95A1\u95A8\u95A9\u95A3\u95A5\u95A4\u9699\u969C\u969B\u96CC\u96D2\u9700\u977C\u9785\u97F6\u9817\u9818\u98AF\u98B1\u9903\u9905\u990C\u9909\u99C1\u9AAF\u9AB0\u9AE6\u9B41\u9B42\u9CF4\u9CF6\u9CF3\u9EBC\u9F3B\u9F4A\u5104\u5100\u50FB\u50F5\u50F9\u5102\u5108\u5109\u5105\u51DC\u5287\u5288\u5289\u528D\u528A\u52F0\u53B2\u562E\u563B\u5639\u5632\u563F\u5634\u5629\u5653\u564E\u5657\u5674\u5636\u562F\u5630\u5880\u589F\u589E\u58B3\u589C\u58AE\u58A9\u58A6\u596D\u5B09\u5AFB\u5B0B\u5AF5\u5B0C\u5B08\u5BEE\u5BEC\u5BE9\u5BEB\u5C64\u5C65\u5D9D\u5D94\u5E62\u5E5F\u5E61\u5EE2\u5EDA\u5EDF\u5EDD\u5EE3\u5EE0\u5F48\u5F71\u5FB7\u5FB5\u6176\u6167\u616E\u615D\u6155\u6182\u617C\u6170\u616B\u617E\u61A7\u6190\u61AB\u618E\u61AC\u619A\u61A4\u6194\u61AE\u622E\u6469\u646F\u6479\u649E\u64B2\u6488\u6490\u64B0\u64A5\u6493\u6495\u64A9\u6492\u64AE\u64AD\u64AB\u649A\u64AC\u6499\u64A2\u64B3\u6575\u6577\u6578\u66AE\u66AB\u66B4\u66B1\u6A23\u6A1F\u69E8\u6A01\u6A1E\u6A19\u69FD\u6A21\u6A13\u6A0A\u69F3\u6A02\u6A05\u69ED\u6A11\u6B50\u6B4E\u6BA4\u6BC5\u6BC6\u6F3F\u6F7C\u6F84\u6F51\u6F66\u6F54\u6F86\u6F6D\u6F5B\u6F78\u6F6E\u6F8E\u6F7A\u6F70\u6F64\u6F97\u6F58\u6ED5\u6F6F\u6F60\u6F5F\u719F\u71AC\u71B1\u71A8\u7256\u729B\u734E\u7357\u7469\u748B\u7483\u747E\u7480\u757F\u7620\u7629\u761F\u7624\u7626\u7621\u7622\u769A\u76BA\u76E4\u778E\u7787\u778C\u7791\u778B\u78CB\u78C5\u78BA\u78CA\u78BE\u78D5\u78BC\u78D0\u7A3F\u7A3C\u7A40\u7A3D\u7A37\u7A3B\u7AAF\u7AAE\u7BAD\u7BB1\u7BC4\u7BB4\u7BC6\u7BC7\u7BC1\u7BA0\u7BCC\u7CCA\u7DE0\u7DF4\u7DEF\u7DFB\u7DD8\u7DEC\u7DDD\u7DE8\u7DE3\u7DDA\u7DDE\u7DE9\u7D9E\u7DD9\u7DF2\u7DF9\u7F75\u7F77\u7FAF\u7FE9\u8026\u819B\u819C\u819D\u81A0\u819A\u8198\u8517\u853D\u851A\u84EE\u852C\u852D\u8513\u8511\u8523\u8521\u8514\u84EC\u8525\u84FF\u8506\u8782\u8774\u8776\u8760\u8766\u8778\u8768\u8759\u8757\u874C\u8753\u885B\u885D\u8910\u8907\u8912\u8913\u8915\u890A\u8ABC\u8AD2\u8AC7\u8AC4\u8A95\u8ACB\u8AF8\u8AB2\u8AC9\u8AC2\u8ABF\u8AB0\u8AD6\u8ACD\u8AB6\u8AB9\u8ADB\u8C4C\u8C4E\u8C6C\u8CE0\u8CDE\u8CE6\u8CE4\u8CEC\u8CED\u8CE2\u8CE3\u8CDC\u8CEA\u8CE1\u8D6D\u8D9F\u8DA3\u8E2B\u8E10\u8E1D\u8E22\u8E0F\u8E29\u8E1F\u8E21\u8E1E\u8EBA\u8F1D\u8F1B\u8F1F\u8F29\u8F26\u8F2A\u8F1C\u8F1E\u8F25\u9069\u906E\u9068\u906D\u9077\u9130\u912D\u9127\u9131\u9187\u9189\u918B\u9183\u92C5\u92BB\u92B7\u92EA\u92AC\u92E4\u92C1\u92B3\u92BC\u92D2\u92C7\u92F0\u92B2\u95AD\u95B1\u9704\u9706\u9707\u9709\u9760\u978D\u978B\u978F\u9821\u982B\u981C\u98B3\u990A\u9913\u9912\u9918\u99DD\u99D0\u99DF\u99DB\u99D1\u99D5\u99D2\u99D9\u9AB7\u9AEE\u9AEF\u9B27\u9B45\u9B44\u9B77\u9B6F\u9D06\u9D09\u9D03\u9EA9\u9EBE\u9ECE\u58A8\u9F52\u5112\u5118\u5114\u5110\u5115\u5180\u51AA\u51DD\u5291\u5293\u52F3\u5659\u566B\u5679\u5669\u5664\u5678\u566A\u5668\u5665\u5671\u566F\u566C\u5662\u5676\u58C1\u58BE\u58C7\u58C5\u596E\u5B1D\u5B34\u5B78\u5BF0\u5C0E\u5F4A\u61B2\u6191\u61A9\u618A\u61CD\u61B6\u61BE\u61CA\u61C8\u6230\u64C5\u64C1\u64CB\u64BB\u64BC\u64DA\u64C4\u64C7\u64C2\u64CD\u64BF\u64D2\u64D4\u64BE\u6574\u66C6\u66C9\u66B9\u66C4\u66C7\u66B8\u6A3D\u6A38\u6A3A\u6A59\u6A6B\u6A58\u6A39\u6A44\u6A62\u6A61\u6A4B\u6A47\u6A35\u6A5F\u6A48\u6B59\u6B77\u6C05\u6FC2\u6FB1\u6FA1\u6FC3\u6FA4\u6FC1\u6FA7\u6FB3\u6FC0\u6FB9\u6FA6\u6FA0\u6FB4\u71BE\u71C9\u71D0\u71D2\u71C8\u71D5\u71B9\u71CE\u71D9\u71DC\u71C3\u71C4\u7368\u749C\u74A3\u7498\u749F\u749E\u74E2\u750C\u750D\u7634\u7638\u763A\u76E7\u76E5\u77A0\u779E\u779F\u77A5\u78E8\u78DA\u78EC\u78E7\u79A6\u7A4D\u7A4E\u7A46\u7A4C\u7A4B\u7ABA\u7BD9\u7C11\u7BC9\u7BE4\u7BDB\u7BE1\u7BE9\u7BE6\u7CD5\u7CD6\u7E0A\u7E11\u7E08\u7E1B\u7E23\u7E1E\u7E09\u7E10\u7F79\u7FB2\u7FF0\u7FF1\u7FEE\u81B3\u81A9\u81A8\u81FB\u8208\u8258\u8259\u854A\u8559\u8548\u8568\u8569\u8543\u8549\u856D\u856A\u855E\u8783\u879F\u879E\u87A2\u878D\u8861\u892A\u8932\u8925\u892B\u8921\u89AA\u8AE6\u8AFA\u8AEB\u8AF1\u8B00\u8ADC\u8AE7\u8AEE\u8AFE\u8B01\u8B02\u8AF7\u8AED\u8AF3\u8AF6\u8AFC\u8C6B\u8C6D\u8C93\u8CF4\u8E44\u8E31\u8E34\u8E42\u8E39\u8E35\u8F3B\u8F2F\u8F38\u8F33\u8FA8\u8FA6\u9075\u9074\u9078\u9072\u907C\u907A\u9134\u9192\u9320\u9336\u92F8\u9333\u932F\u9322\u92FC\u932B\u9304\u931A\u9310\u9326\u9321\u9315\u932E\u9319\u95BB\u96A7\u96A8\u96AA\u96D5\u970E\u9711\u9716\u970D\u9713\u970F\u975B\u9766\u9798\u9830\u9838\u983B\u9837\u982D\u9839\u9824\u9910\u9928\u991E\u991B\u9921\u991A\u99ED\u99E2\u99F1\u9AB8\u9ABC\u9AFB\u9AED\u9B28\u9B91\u9D15\u9D23\u9D26\u9D28\u9D12\u9D1B\u9ED8\u9ED4\u9F8D\u9F9C\u512A\u511F\u5121\u5132\u52F5\u568E\u5680\u5690\u5685\u5687\u568F\u58D5\u58D3\u58D1\u58CE\u5B30\u5B2A\u5B24\u5B7A\u5C37\u5C68\u5DBC\u5DBA\u5DBD\u5DB8\u5E6B\u5F4C\u5FBD\u61C9\u61C2\u61C7\u61E6\u61CB\u6232\u6234\u64CE\u64CA\u64D8\u64E0\u64F0\u64E6\u64EC\u64F1\u64E2\u64ED\u6582\u6583\u66D9\u66D6\u6A80\u6A94\u6A84\u6AA2\u6A9C\u6ADB\u6AA3\u6A7E\u6A97\u6A90\u6AA0\u6B5C\u6BAE\u6BDA\u6C08\u6FD8\u6FF1\u6FDF\u6FE0\u6FDB\u6FE4\u6FEB\u6FEF\u6F80\u6FEC\u6FE1\u6FE9\u6FD5\u6FEE\u6FF0\u71E7\u71EE\u71E6\u71E5\u71ED\u71EC\u71F4\u71E0\u7235\u7246\u7370\u7372\u74A9\u74B0\u74A6\u74A8\u7646\u7642\u764C\u76EA\u77B3\u77AA\u77B0\u77AC\u77A7\u77AD\u77EF\u78F7\u78FA\u78F4\u78EF\u7901\u79A7\u79AA\u7A57\u7ABF\u7C07\u7C0D\u7BFE\u7BF7\u7C0C\u7BE0\u7CE0\u7CDC\u7CDE\u7CE2\u7CDF\u7CD9\u7CDD\u7E2E\u7E3E\u7E46\u7E37\u7E32\u7E43\u7E2B\u7E3D\u7E31\u7E45\u7E41\u7E34\u7E39\u7E48\u7E35\u7E3F\u7E2F\u7F44\u7FF3\u7FFC\u8071\u8072\u8070\u806F\u8073\u81C6\u81C3\u81BA\u81C2\u81C0\u81BF\u81BD\u81C9\u81BE\u81E8\u8209\u8271\u85AA\u8584\u857E\u859C\u8591\u8594\u85AF\u859B\u8587\u85A8\u858A\u8667\u87C0\u87D1\u87B3\u87D2\u87C6\u87AB\u87BB\u87BA\u87C8\u87CB\u893B\u8936\u8944\u8938\u893D\u89AC\u8B0E\u8B17\u8B19\u8B1B\u8B0A\u8B20\u8B1D\u8B04\u8B10\u8C41\u8C3F\u8C73\u8CFA\u8CFD\u8CFC\u8CF8\u8CFB\u8DA8\u8E49\u8E4B\u8E48\u8E4A\u8F44\u8F3E\u8F42\u8F45\u8F3F\u907F\u907D\u9084\u9081\u9082\u9080\u9139\u91A3\u919E\u919C\u934D\u9382\u9328\u9375\u934A\u9365\u934B\u9318\u937E\u936C\u935B\u9370\u935A\u9354\u95CA\u95CB\u95CC\u95C8\u95C6\u96B1\u96B8\u96D6\u971C\u971E\u97A0\u97D3\u9846\u98B6\u9935\u9A01\u99FF\u9BAE\u9BAB\u9BAA\u9BAD\u9D3B\u9D3F\u9E8B\u9ECF\u9EDE\u9EDC\u9EDD\u9EDB\u9F3E\u9F4B\u53E2\u5695\u56AE\u58D9\u58D8\u5B38\u5F5D\u61E3\u6233\u64F4\u64F2\u64FE\u6506\u64FA\u64FB\u64F7\u65B7\u66DC\u6726\u6AB3\u6AAC\u6AC3\u6ABB\u6AB8\u6AC2\u6AAE\u6AAF\u6B5F\u6B78\u6BAF\u7009\u700B\u6FFE\u7006\u6FFA\u7011\u700F\u71FB\u71FC\u71FE\u71F8\u7377\u7375\u74A7\u74BF\u7515\u7656\u7658\u7652\u77BD\u77BF\u77BB\u77BC\u790E\u79AE\u7A61\u7A62\u7A60\u7AC4\u7AC5\u7C2B\u7C27\u7C2A\u7C1E\u7C23\u7C21\u7CE7\u7E54\u7E55\u7E5E\u7E5A\u7E61\u7E52\u7E59\u7F48\u7FF9\u7FFB\u8077\u8076\u81CD\u81CF\u820A\u85CF\u85A9\u85CD\u85D0\u85C9\u85B0\u85BA\u85B9\u85A6\u87EF\u87EC\u87F2\u87E0\u8986\u89B2\u89F4\u8B28\u8B39\u8B2C\u8B2B\u8C50\u8D05\u8E59\u8E63\u8E66\u8E64\u8E5F\u8E55\u8EC0\u8F49\u8F4D\u9087\u9083\u9088\u91AB\u91AC\u91D0\u9394\u938A\u9396\u93A2\u93B3\u93AE\u93AC\u93B0\u9398\u939A\u9397\u95D4\u95D6\u95D0\u95D5\u96E2\u96DC\u96D9\u96DB\u96DE\u9724\u97A3\u97A6\u97AD\u97F9\u984D\u984F\u984C\u984E\u9853\u98BA\u993E\u993F\u993D\u992E\u99A5\u9A0E\u9AC1\u9B03\u9B06\u9B4F\u9B4E\u9B4D\u9BCA\u9BC9\u9BFD\u9BC8\u9BC0\u9D51\u9D5D\u9D60\u9EE0\u9F15\u9F2C\u5133\u56A5\u58DE\u58DF\u58E2\u5BF5\u9F90\u5EEC\u61F2\u61F7\u61F6\u61F5\u6500\u650F\u66E0\u66DD\u6AE5\u6ADD\u6ADA\u6AD3\u701B\u701F\u7028\u701A\u701D\u7015\u7018\u7206\u720D\u7258\u72A2\u7378\u737A\u74BD\u74CA\u74E3\u7587\u7586\u765F\u7661\u77C7\u7919\u79B1\u7A6B\u7A69\u7C3E\u7C3F\u7C38\u7C3D\u7C37\u7C40\u7E6B\u7E6D\u7E79\u7E69\u7E6A\u7F85\u7E73\u7FB6\u7FB9\u7FB8\u81D8\u85E9\u85DD\u85EA\u85D5\u85E4\u85E5\u85F7\u87FB\u8805\u880D\u87F9\u87FE\u8960\u895F\u8956\u895E\u8B41\u8B5C\u8B58\u8B49\u8B5A\u8B4E\u8B4F\u8B46\u8B59\u8D08\u8D0A\u8E7C\u8E72\u8E87\u8E76\u8E6C\u8E7A\u8E74\u8F54\u8F4E\u8FAD\u908A\u908B\u91B1\u91AE\u93E1\u93D1\u93DF\u93C3\u93C8\u93DC\u93DD\u93D6\u93E2\u93CD\u93D8\u93E4\u93D7\u93E8\u95DC\u96B4\u96E3\u972A\u9727\u9761\u97DC\u97FB\u985E\u9858\u985B\u98BC\u9945\u9949\u9A16\u9A19\u9B0D\u9BE8\u9BE7\u9BD6\u9BDB\u9D89\u9D61\u9D72\u9D6A\u9D6C\u9E92\u9E97\u9E93\u9EB4\u52F8\u56A8\u56B7\u56B6\u56B4\u56BC\u58E4\u5B40\u5B43\u5B7D\u5BF6\u5DC9\u61F8\u61FA\u6518\u6514\u6519\u66E6\u6727\u6AEC\u703E\u7030\u7032\u7210\u737B\u74CF\u7662\u7665\u7926\u792A\u792C\u792B\u7AC7\u7AF6\u7C4C\u7C43\u7C4D\u7CEF\u7CF0\u8FAE\u7E7D\u7E7C\u7E82\u7F4C\u8000\u81DA\u8266\u85FB\u85F9\u8611\u85FA\u8606\u860B\u8607\u860A\u8814\u8815\u8964\u89BA\u89F8\u8B70\u8B6C\u8B66\u8B6F\u8B5F\u8B6B\u8D0F\u8D0D\u8E89\u8E81\u8E85\u8E82\u91B4\u91CB\u9418\u9403\u93FD\u95E1\u9730\u98C4\u9952\u9951\u99A8\u9A2B\u9A30\u9A37\u9A35\u9C13\u9C0D\u9E79\u9EB5\u9EE8\u9F2F\u9F5F\u9F63\u9F61\u5137\u5138\u56C1\u56C0\u56C2\u5914\u5C6C\u5DCD\u61FC\u61FE\u651D\u651C\u6595\u66E9\u6AFB\u6B04\u6AFA\u6BB2\u704C\u721B\u72A7\u74D6\u74D4\u7669\u77D3\u7C50\u7E8F\u7E8C\u7FBC\u8617\u862D\u861A\u8823\u8822\u8821\u881F\u896A\u896C\u89BD\u8B74\u8B77\u8B7D\u8D13\u8E8A\u8E8D\u8E8B\u8F5F\u8FAF\u91BA\u942E\u9433\u9435\u943A\u9438\u9432\u942B\u95E2\u9738\u9739\u9732\u9867\u9865\u9957\u9A45\u9A43\u9A40\u9A3E\u9ACF\u9B54\u9B51\u9C2D\u9C25\u9DAF\u9DB4\u9DC2\u9DB8\u9E9D\u9EEF\u9F19\u9F5C\u9F66\u9F67\u513C\u513B\u56C8\u56CA\u56C9\u5B7F\u5DD4\u5DD2\u5F4E\u61FF\u6524\u6B0A\u6B61\u7051\u7058\u7380\u74E4\u758A\u766E\u766C\u79B3\u7C60\u7C5F\u807E\u807D\u81DF\u8972\u896F\u89FC\u8B80\u8D16\u8D17\u8E91\u8E93\u8F61\u9148\u9444\u9451\u9452\u973D\u973E\u97C3\u97C1\u986B\u9955\u9A55\u9A4D\u9AD2\u9B1A\u9C49\u9C31\u9C3E\u9C3B\u9DD3\u9DD7\u9F34\u9F6C\u9F6A\u9F94\u56CC\u5DD6\u6200\u6523\u652B\u652A\u66EC\u6B10\u74DA\u7ACA\u7C64\u7C63\u7C65\u7E93\u7E96\u7E94\u81E2\u8638\u863F\u8831\u8B8A\u9090\u908F\u9463\u9460\u9464\u9768\u986F\u995C\u9A5A\u9A5B\u9A57\u9AD3\u9AD4\u9AD1\u9C54\u9C57\u9C56\u9DE5\u9E9F\u9EF4\u56D1\u58E9\u652C\u705E\u7671\u7672\u7F50\u7F88\u8836\u8839\u8862\u8B93\u8B92\u8B96\u8277\u8D1B\u91C0\u946A\u9742\u9748\u9744\u97C6\u9870\u9A5F\u9B22\u9B58\u9C5F\u9DF9\u9DFA\u9E7C\u9E7D\u9F07\u9F77\u9F72\u5EF3\u6B16\u7063\u7C6C\u7C6E\u883B\u89C0\u8EA1\u91C1\u9472\u9470\u9871\u995E\u9AD6\u9B23\u9ECC\u7064\u77DA\u8B9A\u9477\u97C9\u9A62\u9A65\u7E9C\u8B9C\u8EAA\u91C5\u947D\u947E\u947C\u9C77\u9C78\u9EF7\u8C54\u947F\u9E1A\u7228\u9A6A\u9B31\u9E1B\u9E1E\u7C72\u3003\u4E42\u4E5C\u51F5\u531A\u5382\u4E07\u4E0C\u4E47\u4E8D\u56D7\uFA0C\u5C6E\u5F73\u4E0F\u5187\u4E0E\u4E2E\u4E93\u4EC2\u4EC9\u4EC8\u5198\u52FC\u536C\u53B9\u5720\u5903\u592C\u5DFF\u65E1\u6BB3\u6BCC\u6C14\u723F\u4E31\u4E3C\u4EE8\u4EDC\u4EE9\u4EE1\u4EDA\u520C\u531C\u534C\u5722\u5723\u5917\u592F\u5B81\u5B84\u5C12\u5C3B\u5C74\u5C73\u5E04\u5E80\u5E82\u5FC9\u6209\u6250\u6C15\u6C36\u6C43\u6C3F\u6C3B\u72AE\u72B0\u738A\u79B8\u808A\u961E\u4F0E\u4F18\u4F2C\u4EF5\u4F14\u4EF1\u4F00\u4EF7\u4F08\u4F1D\u4F02\u4F05\u4F22\u4F13\u4F04\u4EF4\u4F12\u51B1\u5213\u5209\u5210\u52A6\u5322\u531F\u534D\u538A\u5407\u56E1\u56DF\u572E\u572A\u5734\u593C\u5980\u597C\u5985\u597B\u597E\u5977\u597F\u5B56\u5C15\u5C25\u5C7C\u5C7A\u5C7B\u5C7E\u5DDF\u5E75\u5E84\u5F02\u5F1A\u5F74\u5FD5\u5FD4\u5FCF\u625C\u625E\u6264\u6261\u6266\u6262\u6259\u6260\u625A\u6265\u65EF\u65EE\u673E\u6739\u6738\u673B\u673A\u673F\u673C\u6733\u6C18\u6C46\u6C52\u6C5C\u6C4F\u6C54\u6C4B\u6C4C\u7071\u725E\u72B4\u72B5\u738E\u752A\u767F\u7A75\u7F51\u8278\u827C\u8280\u827D\u827F\u864D\u897E\u9099\u9098\u909B\u9094\u9622\u9624\u9620\u9623\u4F56\u4F3B\u4F62\u4F49\u4F53\u4F64\u4F3E\u4F67\u4F52\u4F5F\u4F41\u4F58\u4F2D\u4F33\u4F3F\u4F61\u518F\u51B9\u521C\u521E\u5221\u52AD\u52AE\u5309\u5363\u5372\u538E\u538F\u5430\u5437\u542A\u5454\u5445\u5419\u541C\u5425\u5418\u543D\u544F\u5441\u5428\u5424\u5447\u56EE\u56E7\u56E5\u5741\u5745\u574C\u5749\u574B\u5752\u5906\u5940\u59A6\u5998\u59A0\u5997\u598E\u59A2\u5990\u598F\u59A7\u59A1\u5B8E\u5B92\u5C28\u5C2A\u5C8D\u5C8F\u5C88\u5C8B\u5C89\u5C92\u5C8A\u5C86\u5C93\u5C95\u5DE0\u5E0A\u5E0E\u5E8B\u5E89\u5E8C\u5E88\u5E8D\u5F05\u5F1D\u5F78\u5F76\u5FD2\u5FD1\u5FD0\u5FED\u5FE8\u5FEE\u5FF3\u5FE1\u5FE4\u5FE3\u5FFA\u5FEF\u5FF7\u5FFB\u6000\u5FF4\u623A\u6283\u628C\u628E\u628F\u6294\u6287\u6271\u627B\u627A\u6270\u6281\u6288\u6277\u627D\u6272\u6274\u6537\u65F0\u65F4\u65F3\u65F2\u65F5\u6745\u6747\u6759\u6755\u674C\u6748\u675D\u674D\u675A\u674B\u6BD0\u6C19\u6C1A\u6C78\u6C67\u6C6B\u6C84\u6C8B\u6C8F\u6C71\u6C6F\u6C69\u6C9A\u6C6D\u6C87\u6C95\u6C9C\u6C66\u6C73\u6C65\u6C7B\u6C8E\u7074\u707A\u7263\u72BF\u72BD\u72C3\u72C6\u72C1\u72BA\u72C5\u7395\u7397\u7393\u7394\u7392\u753A\u7539\u7594\u7595\u7681\u793D\u8034\u8095\u8099\u8090\u8092\u809C\u8290\u828F\u8285\u828E\u8291\u8293\u828A\u8283\u8284\u8C78\u8FC9\u8FBF\u909F\u90A1\u90A5\u909E\u90A7\u90A0\u9630\u9628\u962F\u962D\u4E33\u4F98\u4F7C\u4F85\u4F7D\u4F80\u4F87\u4F76\u4F74\u4F89\u4F84\u4F77\u4F4C\u4F97\u4F6A\u4F9A\u4F79\u4F81\u4F78\u4F90\u4F9C\u4F94\u4F9E\u4F92\u4F82\u4F95\u4F6B\u4F6E\u519E\u51BC\u51BE\u5235\u5232\u5233\u5246\u5231\u52BC\u530A\u530B\u533C\u5392\u5394\u5487\u547F\u5481\u5491\u5482\u5488\u546B\u547A\u547E\u5465\u546C\u5474\u5466\u548D\u546F\u5461\u5460\u5498\u5463\u5467\u5464\u56F7\u56F9\u576F\u5772\u576D\u576B\u5771\u5770\u5776\u5780\u5775\u577B\u5773\u5774\u5762\u5768\u577D\u590C\u5945\u59B5\u59BA\u59CF\u59CE\u59B2\u59CC\u59C1\u59B6\u59BC\u59C3\u59D6\u59B1\u59BD\u59C0\u59C8\u59B4\u59C7\u5B62\u5B65\u5B93\u5B95\u5C44\u5C47\u5CAE\u5CA4\u5CA0\u5CB5\u5CAF\u5CA8\u5CAC\u5C9F\u5CA3\u5CAD\u5CA2\u5CAA\u5CA7\u5C9D\u5CA5\u5CB6\u5CB0\u5CA6\u5E17\u5E14\u5E19\u5F28\u5F22\u5F23\u5F24\u5F54\u5F82\u5F7E\u5F7D\u5FDE\u5FE5\u602D\u6026\u6019\u6032\u600B\u6034\u600A\u6017\u6033\u601A\u601E\u602C\u6022\u600D\u6010\u602E\u6013\u6011\u600C\u6009\u601C\u6214\u623D\u62AD\u62B4\u62D1\u62BE\u62AA\u62B6\u62CA\u62AE\u62B3\u62AF\u62BB\u62A9\u62B0\u62B8\u653D\u65A8\u65BB\u6609\u65FC\u6604\u6612\u6608\u65FB\u6603\u660B\u660D\u6605\u65FD\u6611\u6610\u66F6\u670A\u6785\u676C\u678E\u6792\u6776\u677B\u6798\u6786\u6784\u6774\u678D\u678C\u677A\u679F\u6791\u6799\u6783\u677D\u6781\u6778\u6779\u6794\u6B25\u6B80\u6B7E\u6BDE\u6C1D\u6C93\u6CEC\u6CEB\u6CEE\u6CD9\u6CB6\u6CD4\u6CAD\u6CE7\u6CB7\u6CD0\u6CC2\u6CBA\u6CC3\u6CC6\u6CED\u6CF2\u6CD2\u6CDD\u6CB4\u6C8A\u6C9D\u6C80\u6CDE\u6CC0\u6D30\u6CCD\u6CC7\u6CB0\u6CF9\u6CCF\u6CE9\u6CD1\u7094\u7098\u7085\u7093\u7086\u7084\u7091\u7096\u7082\u709A\u7083\u726A\u72D6\u72CB\u72D8\u72C9\u72DC\u72D2\u72D4\u72DA\u72CC\u72D1\u73A4\u73A1\u73AD\u73A6\u73A2\u73A0\u73AC\u739D\u74DD\u74E8\u753F\u7540\u753E\u758C\u7598\u76AF\u76F3\u76F1\u76F0\u76F5\u77F8\u77FC\u77F9\u77FB\u77FA\u77F7\u7942\u793F\u79C5\u7A78\u7A7B\u7AFB\u7C75\u7CFD\u8035\u808F\u80AE\u80A3\u80B8\u80B5\u80AD\u8220\u82A0\u82C0\u82AB\u829A\u8298\u829B\u82B5\u82A7\u82AE\u82BC\u829E\u82BA\u82B4\u82A8\u82A1\u82A9\u82C2\u82A4\u82C3\u82B6\u82A2\u8670\u866F\u866D\u866E\u8C56\u8FD2\u8FCB\u8FD3\u8FCD\u8FD6\u8FD5\u8FD7\u90B2\u90B4\u90AF\u90B3\u90B0\u9639\u963D\u963C\u963A\u9643\u4FCD\u4FC5\u4FD3\u4FB2\u4FC9\u4FCB\u4FC1\u4FD4\u4FDC\u4FD9\u4FB3\u4FDB\u4FC7\u4FD6\u4FBA\u4FC0\u4FB9\u4FEC\u5244\u5249\u52C0\u52C2\u533D\u537C\u5397\u5396\u5399\u5398\u54BA\u54A1\u54AD\u54A5\u54CF\u54C3\u830D\u54B7\u54AE\u54D6\u54B6\u54C5\u54C6\u54A0\u5470\u54BC\u54A2\u54BE\u5472\u54DE\u54B0\u57B5\u579E\u579F\u57A4\u578C\u5797\u579D\u579B\u5794\u5798\u578F\u5799\u57A5\u579A\u5795\u58F4\u590D\u5953\u59E1\u59DE\u59EE\u5A00\u59F1\u59DD\u59FA\u59FD\u59FC\u59F6\u59E4\u59F2\u59F7\u59DB\u59E9\u59F3\u59F5\u59E0\u59FE\u59F4\u59ED\u5BA8\u5C4C\u5CD0\u5CD8\u5CCC\u5CD7\u5CCB\u5CDB\u5CDE\u5CDA\u5CC9\u5CC7\u5CCA\u5CD6\u5CD3\u5CD4\u5CCF\u5CC8\u5CC6\u5CCE\u5CDF\u5CF8\u5DF9\u5E21\u5E22\u5E23\u5E20\u5E24\u5EB0\u5EA4\u5EA2\u5E9B\u5EA3\u5EA5\u5F07\u5F2E\u5F56\u5F86\u6037\u6039\u6054\u6072\u605E\u6045\u6053\u6047\u6049\u605B\u604C\u6040\u6042\u605F\u6024\u6044\u6058\u6066\u606E\u6242\u6243\u62CF\u630D\u630B\u62F5\u630E\u6303\u62EB\u62F9\u630F\u630C\u62F8\u62F6\u6300\u6313\u6314\u62FA\u6315\u62FB\u62F0\u6541\u6543\u65AA\u65BF\u6636\u6621\u6632\u6635\u661C\u6626\u6622\u6633\u662B\u663A\u661D\u6634\u6639\u662E\u670F\u6710\u67C1\u67F2\u67C8\u67BA\u67DC\u67BB\u67F8\u67D8\u67C0\u67B7\u67C5\u67EB\u67E4\u67DF\u67B5\u67CD\u67B3\u67F7\u67F6\u67EE\u67E3\u67C2\u67B9\u67CE\u67E7\u67F0\u67B2\u67FC\u67C6\u67ED\u67CC\u67AE\u67E6\u67DB\u67FA\u67C9\u67CA\u67C3\u67EA\u67CB\u6B28\u6B82\u6B84\u6BB6\u6BD6\u6BD8\u6BE0\u6C20\u6C21\u6D28\u6D34\u6D2D\u6D1F\u6D3C\u6D3F\u6D12\u6D0A\u6CDA\u6D33\u6D04\u6D19\u6D3A\u6D1A\u6D11\u6D00\u6D1D\u6D42\u6D01\u6D18\u6D37\u6D03\u6D0F\u6D40\u6D07\u6D20\u6D2C\u6D08\u6D22\u6D09\u6D10\u70B7\u709F\u70BE\u70B1\u70B0\u70A1\u70B4\u70B5\u70A9\u7241\u7249\u724A\u726C\u7270\u7273\u726E\u72CA\u72E4\u72E8\u72EB\u72DF\u72EA\u72E6\u72E3\u7385\u73CC\u73C2\u73C8\u73C5\u73B9\u73B6\u73B5\u73B4\u73EB\u73BF\u73C7\u73BE\u73C3\u73C6\u73B8\u73CB\u74EC\u74EE\u752E\u7547\u7548\u75A7\u75AA\u7679\u76C4\u7708\u7703\u7704\u7705\u770A\u76F7\u76FB\u76FA\u77E7\u77E8\u7806\u7811\u7812\u7805\u7810\u780F\u780E\u7809\u7803\u7813\u794A\u794C\u794B\u7945\u7944\u79D5\u79CD\u79CF\u79D6\u79CE\u7A80\u7A7E\u7AD1\u7B00\u7B01\u7C7A\u7C78\u7C79\u7C7F\u7C80\u7C81\u7D03\u7D08\u7D01\u7F58\u7F91\u7F8D\u7FBE\u8007\u800E\u800F\u8014\u8037\u80D8\u80C7\u80E0\u80D1\u80C8\u80C2\u80D0\u80C5\u80E3\u80D9\u80DC\u80CA\u80D5\u80C9\u80CF\u80D7\u80E6\u80CD\u81FF\u8221\u8294\u82D9\u82FE\u82F9\u8307\u82E8\u8300\u82D5\u833A\u82EB\u82D6\u82F4\u82EC\u82E1\u82F2\u82F5\u830C\u82FB\u82F6\u82F0\u82EA\u82E4\u82E0\u82FA\u82F3\u82ED\u8677\u8674\u867C\u8673\u8841\u884E\u8867\u886A\u8869\u89D3\u8A04\u8A07\u8D72\u8FE3\u8FE1\u8FEE\u8FE0\u90F1\u90BD\u90BF\u90D5\u90C5\u90BE\u90C7\u90CB\u90C8\u91D3\u9654\u964F\u9651\u9653\u964A\u964E\u501E\u5005\u5007\u5013\u5022\u5030\u501B\u4FF5\u4FF4\u5033\u5037\u502C\u4FF6\u4FF7\u5017\u501C\u5020\u5027\u5035\u502F\u5031\u500E\u515A\u5194\u5193\u51CA\u51C4\u51C5\u51C8\u51CE\u5261\u525A\u5252\u525E\u525F\u5255\u5262\u52CD\u530E\u539E\u5526\u54E2\u5517\u5512\u54E7\u54F3\u54E4\u551A\u54FF\u5504\u5508\u54EB\u5511\u5505\u54F1\u550A\u54FB\u54F7\u54F8\u54E0\u550E\u5503\u550B\u5701\u5702\u57CC\u5832\u57D5\u57D2\u57BA\u57C6\u57BD\u57BC\u57B8\u57B6\u57BF\u57C7\u57D0\u57B9\u57C1\u590E\u594A\u5A19\u5A16\u5A2D\u5A2E\u5A15\u5A0F\u5A17\u5A0A\u5A1E\u5A33\u5B6C\u5BA7\u5BAD\u5BAC\u5C03\u5C56\u5C54\u5CEC\u5CFF\u5CEE\u5CF1\u5CF7\u5D00\u5CF9\u5E29\u5E28\u5EA8\u5EAE\u5EAA\u5EAC\u5F33\u5F30\u5F67\u605D\u605A\u6067\u6041\u60A2\u6088\u6080\u6092\u6081\u609D\u6083\u6095\u609B\u6097\u6087\u609C\u608E\u6219\u6246\u62F2\u6310\u6356\u632C\u6344\u6345\u6336\u6343\u63E4\u6339\u634B\u634A\u633C\u6329\u6341\u6334\u6358\u6354\u6359\u632D\u6347\u6333\u635A\u6351\u6338\u6357\u6340\u6348\u654A\u6546\u65C6\u65C3\u65C4\u65C2\u664A\u665F\u6647\u6651\u6712\u6713\u681F\u681A\u6849\u6832\u6833\u683B\u684B\u684F\u6816\u6831\u681C\u6835\u682B\u682D\u682F\u684E\u6844\u6834\u681D\u6812\u6814\u6826\u6828\u682E\u684D\u683A\u6825\u6820\u6B2C\u6B2F\u6B2D\u6B31\u6B34\u6B6D\u8082\u6B88\u6BE6\u6BE4\u6BE8\u6BE3\u6BE2\u6BE7\u6C25\u6D7A\u6D63\u6D64\u6D76\u6D0D\u6D61\u6D92\u6D58\u6D62\u6D6D\u6D6F\u6D91\u6D8D\u6DEF\u6D7F\u6D86\u6D5E\u6D60\u6D97\u6D70\u6D7C\u6D5F\u6D82\u6D98\u6D2F\u6D68\u6D8B\u6D7E\u6D80\u6D84\u6D16\u6D83\u6D7B\u6D7D\u6D75\u6D90\u70DC\u70D3\u70D1\u70DD\u70CB\u7F39\u70E2\u70D7\u70D2\u70DE\u70E0\u70D4\u70CD\u70C5\u70C6\u70C7\u70DA\u70CE\u70E1\u7242\u7278\u7277\u7276\u7300\u72FA\u72F4\u72FE\u72F6\u72F3\u72FB\u7301\u73D3\u73D9\u73E5\u73D6\u73BC\u73E7\u73E3\u73E9\u73DC\u73D2\u73DB\u73D4\u73DD\u73DA\u73D7\u73D8\u73E8\u74DE\u74DF\u74F4\u74F5\u7521\u755B\u755F\u75B0\u75C1\u75BB\u75C4\u75C0\u75BF\u75B6\u75BA\u768A\u76C9\u771D\u771B\u7710\u7713\u7712\u7723\u7711\u7715\u7719\u771A\u7722\u7727\u7823\u782C\u7822\u7835\u782F\u7828\u782E\u782B\u7821\u7829\u7833\u782A\u7831\u7954\u795B\u794F\u795C\u7953\u7952\u7951\u79EB\u79EC\u79E0\u79EE\u79ED\u79EA\u79DC\u79DE\u79DD\u7A86\u7A89\u7A85\u7A8B\u7A8C\u7A8A\u7A87\u7AD8\u7B10\u7B04\u7B13\u7B05\u7B0F\u7B08\u7B0A\u7B0E\u7B09\u7B12\u7C84\u7C91\u7C8A\u7C8C\u7C88\u7C8D\u7C85\u7D1E\u7D1D\u7D11\u7D0E\u7D18\u7D16\u7D13\u7D1F\u7D12\u7D0F\u7D0C\u7F5C\u7F61\u7F5E\u7F60\u7F5D\u7F5B\u7F96\u7F92\u7FC3\u7FC2\u7FC0\u8016\u803E\u8039\u80FA\u80F2\u80F9\u80F5\u8101\u80FB\u8100\u8201\u822F\u8225\u8333\u832D\u8344\u8319\u8351\u8325\u8356\u833F\u8341\u8326\u831C\u8322\u8342\u834E\u831B\u832A\u8308\u833C\u834D\u8316\u8324\u8320\u8337\u832F\u8329\u8347\u8345\u834C\u8353\u831E\u832C\u834B\u8327\u8348\u8653\u8652\u86A2\u86A8\u8696\u868D\u8691\u869E\u8687\u8697\u8686\u868B\u869A\u8685\u86A5\u8699\u86A1\u86A7\u8695\u8698\u868E\u869D\u8690\u8694\u8843\u8844\u886D\u8875\u8876\u8872\u8880\u8871\u887F\u886F\u8883\u887E\u8874\u887C\u8A12\u8C47\u8C57\u8C7B\u8CA4\u8CA3\u8D76\u8D78\u8DB5\u8DB7\u8DB6\u8ED1\u8ED3\u8FFE\u8FF5\u9002\u8FFF\u8FFB\u9004\u8FFC\u8FF6\u90D6\u90E0\u90D9\u90DA\u90E3\u90DF\u90E5\u90D8\u90DB\u90D7\u90DC\u90E4\u9150\u914E\u914F\u91D5\u91E2\u91DA\u965C\u965F\u96BC\u98E3\u9ADF\u9B2F\u4E7F\u5070\u506A\u5061\u505E\u5060\u5053\u504B\u505D\u5072\u5048\u504D\u5041\u505B\u504A\u5062\u5015\u5045\u505F\u5069\u506B\u5063\u5064\u5046\u5040\u506E\u5073\u5057\u5051\u51D0\u526B\u526D\u526C\u526E\u52D6\u52D3\u532D\u539C\u5575\u5576\u553C\u554D\u5550\u5534\u552A\u5551\u5562\u5536\u5535\u5530\u5552\u5545\u550C\u5532\u5565\u554E\u5539\u5548\u552D\u553B\u5540\u554B\u570A\u5707\u57FB\u5814\u57E2\u57F6\u57DC\u57F4\u5800\u57ED\u57FD\u5808\u57F8\u580B\u57F3\u57CF\u5807\u57EE\u57E3\u57F2\u57E5\u57EC\u57E1\u580E\u57FC\u5810\u57E7\u5801\u580C\u57F1\u57E9\u57F0\u580D\u5804\u595C\u5A60\u5A58\u5A55\u5A5E\u5A38\u5A35\u5A6D\u5A50\u5A5F\u5A65\u5A6C\u5A53\u5A64\u5A57\u5A43\u5A5D\u5A52\u5A44\u5A5B\u5A48\u5A8E\u5A3E\u5A4D\u5A39\u5A4C\u5A70\u5A69\u5A47\u5A51\u5A56\u5A42\u5A5C\u5B72\u5B6E\u5BC1\u5BC0\u5C59\u5D1E\u5D0B\u5D1D\u5D1A\u5D20\u5D0C\u5D28\u5D0D\u5D26\u5D25\u5D0F\u5D30\u5D12\u5D23\u5D1F\u5D2E\u5E3E\u5E34\u5EB1\u5EB4\u5EB9\u5EB2\u5EB3\u5F36\u5F38\u5F9B\u5F96\u5F9F\u608A\u6090\u6086\u60BE\u60B0\u60BA\u60D3\u60D4\u60CF\u60E4\u60D9\u60DD\u60C8\u60B1\u60DB\u60B7\u60CA\u60BF\u60C3\u60CD\u60C0\u6332\u6365\u638A\u6382\u637D\u63BD\u639E\u63AD\u639D\u6397\u63AB\u638E\u636F\u6387\u6390\u636E\u63AF\u6375\u639C\u636D\u63AE\u637C\u63A4\u633B\u639F\u6378\u6385\u6381\u6391\u638D\u6370\u6553\u65CD\u6665\u6661\u665B\u6659\u665C\u6662\u6718\u6879\u6887\u6890\u689C\u686D\u686E\u68AE\u68AB\u6956\u686F\u68A3\u68AC\u68A9\u6875\u6874\u68B2\u688F\u6877\u6892\u687C\u686B\u6872\u68AA\u6880\u6871\u687E\u689B\u6896\u688B\u68A0\u6889\u68A4\u6878\u687B\u6891\u688C\u688A\u687D\u6B36\u6B33\u6B37\u6B38\u6B91\u6B8F\u6B8D\u6B8E\u6B8C\u6C2A\u6DC0\u6DAB\u6DB4\u6DB3\u6E74\u6DAC\u6DE9\u6DE2\u6DB7\u6DF6\u6DD4\u6E00\u6DC8\u6DE0\u6DDF\u6DD6\u6DBE\u6DE5\u6DDC\u6DDD\u6DDB\u6DF4\u6DCA\u6DBD\u6DED\u6DF0\u6DBA\u6DD5\u6DC2\u6DCF\u6DC9\u6DD0\u6DF2\u6DD3\u6DFD\u6DD7\u6DCD\u6DE3\u6DBB\u70FA\u710D\u70F7\u7117\u70F4\u710C\u70F0\u7104\u70F3\u7110\u70FC\u70FF\u7106\u7113\u7100\u70F8\u70F6\u710B\u7102\u710E\u727E\u727B\u727C\u727F\u731D\u7317\u7307\u7311\u7318\u730A\u7308\u72FF\u730F\u731E\u7388\u73F6\u73F8\u73F5\u7404\u7401\u73FD\u7407\u7400\u73FA\u73FC\u73FF\u740C\u740B\u73F4\u7408\u7564\u7563\u75CE\u75D2\u75CF\u75CB\u75CC\u75D1\u75D0\u768F\u7689\u76D3\u7739\u772F\u772D\u7731\u7732\u7734\u7733\u773D\u7725\u773B\u7735\u7848\u7852\u7849\u784D\u784A\u784C\u7826\u7845\u7850\u7964\u7967\u7969\u796A\u7963\u796B\u7961\u79BB\u79FA\u79F8\u79F6\u79F7\u7A8F\u7A94\u7A90\u7B35\u7B47\u7B34\u7B25\u7B30\u7B22\u7B24\u7B33\u7B18\u7B2A\u7B1D\u7B31\u7B2B\u7B2D\u7B2F\u7B32\u7B38\u7B1A\u7B23\u7C94\u7C98\u7C96\u7CA3\u7D35\u7D3D\u7D38\u7D36\u7D3A\u7D45\u7D2C\u7D29\u7D41\u7D47\u7D3E\u7D3F\u7D4A\u7D3B\u7D28\u7F63\u7F95\u7F9C\u7F9D\u7F9B\u7FCA\u7FCB\u7FCD\u7FD0\u7FD1\u7FC7\u7FCF\u7FC9\u801F\u801E\u801B\u8047\u8043\u8048\u8118\u8125\u8119\u811B\u812D\u811F\u812C\u811E\u8121\u8115\u8127\u811D\u8122\u8211\u8238\u8233\u823A\u8234\u8232\u8274\u8390\u83A3\u83A8\u838D\u837A\u8373\u83A4\u8374\u838F\u8381\u8395\u8399\u8375\u8394\u83A9\u837D\u8383\u838C\u839D\u839B\u83AA\u838B\u837E\u83A5\u83AF\u8388\u8397\u83B0\u837F\u83A6\u8387\u83AE\u8376\u839A\u8659\u8656\u86BF\u86B7\u86C2\u86C1\u86C5\u86BA\u86B0\u86C8\u86B9\u86B3\u86B8\u86CC\u86B4\u86BB\u86BC\u86C3\u86BD\u86BE\u8852\u8889\u8895\u88A8\u88A2\u88AA\u889A\u8891\u88A1\u889F\u8898\u88A7\u8899\u889B\u8897\u88A4\u88AC\u888C\u8893\u888E\u8982\u89D6\u89D9\u89D5\u8A30\u8A27\u8A2C\u8A1E\u8C39\u8C3B\u8C5C\u8C5D\u8C7D\u8CA5\u8D7D\u8D7B\u8D79\u8DBC\u8DC2\u8DB9\u8DBF\u8DC1\u8ED8\u8EDE\u8EDD\u8EDC\u8ED7\u8EE0\u8EE1\u9024\u900B\u9011\u901C\u900C\u9021\u90EF\u90EA\u90F0\u90F4\u90F2\u90F3\u90D4\u90EB\u90EC\u90E9\u9156\u9158\u915A\u9153\u9155\u91EC\u91F4\u91F1\u91F3\u91F8\u91E4\u91F9\u91EA\u91EB\u91F7\u91E8\u91EE\u957A\u9586\u9588\u967C\u966D\u966B\u9671\u966F\u96BF\u976A\u9804\u98E5\u9997\u509B\u5095\u5094\u509E\u508B\u50A3\u5083\u508C\u508E\u509D\u5068\u509C\u5092\u5082\u5087\u515F\u51D4\u5312\u5311\u53A4\u53A7\u5591\u55A8\u55A5\u55AD\u5577\u5645\u55A2\u5593\u5588\u558F\u55B5\u5581\u55A3\u5592\u55A4\u557D\u558C\u55A6\u557F\u5595\u55A1\u558E\u570C\u5829\u5837\u5819\u581E\u5827\u5823\u5828\u57F5\u5848\u5825\u581C\u581B\u5833\u583F\u5836\u582E\u5839\u5838\u582D\u582C\u583B\u5961\u5AAF\u5A94\u5A9F\u5A7A\u5AA2\u5A9E\u5A78\u5AA6\u5A7C\u5AA5\u5AAC\u5A95\u5AAE\u5A37\u5A84\u5A8A\u5A97\u5A83\u5A8B\u5AA9\u5A7B\u5A7D\u5A8C\u5A9C\u5A8F\u5A93\u5A9D\u5BEA\u5BCD\u5BCB\u5BD4\u5BD1\u5BCA\u5BCE\u5C0C\u5C30\u5D37\u5D43\u5D6B\u5D41\u5D4B\u5D3F\u5D35\u5D51\u5D4E\u5D55\u5D33\u5D3A\u5D52\u5D3D\u5D31\u5D59\u5D42\u5D39\u5D49\u5D38\u5D3C\u5D32\u5D36\u5D40\u5D45\u5E44\u5E41\u5F58\u5FA6\u5FA5\u5FAB\u60C9\u60B9\u60CC\u60E2\u60CE\u60C4\u6114\u60F2\u610A\u6116\u6105\u60F5\u6113\u60F8\u60FC\u60FE\u60C1\u6103\u6118\u611D\u6110\u60FF\u6104\u610B\u624A\u6394\u63B1\u63B0\u63CE\u63E5\u63E8\u63EF\u63C3\u649D\u63F3\u63CA\u63E0\u63F6\u63D5\u63F2\u63F5\u6461\u63DF\u63BE\u63DD\u63DC\u63C4\u63D8\u63D3\u63C2\u63C7\u63CC\u63CB\u63C8\u63F0\u63D7\u63D9\u6532\u6567\u656A\u6564\u655C\u6568\u6565\u658C\u659D\u659E\u65AE\u65D0\u65D2\u667C\u666C\u667B\u6680\u6671\u6679\u666A\u6672\u6701\u690C\u68D3\u6904\u68DC\u692A\u68EC\u68EA\u68F1\u690F\u68D6\u68F7\u68EB\u68E4\u68F6\u6913\u6910\u68F3\u68E1\u6907\u68CC\u6908\u6970\u68B4\u6911\u68EF\u68C6\u6914\u68F8\u68D0\u68FD\u68FC\u68E8\u690B\u690A\u6917\u68CE\u68C8\u68DD\u68DE\u68E6\u68F4\u68D1\u6906\u68D4\u68E9\u6915\u6925\u68C7\u6B39\u6B3B\u6B3F\u6B3C\u6B94\u6B97\u6B99\u6B95\u6BBD\u6BF0\u6BF2\u6BF3\u6C30\u6DFC\u6E46\u6E47\u6E1F\u6E49\u6E88\u6E3C\u6E3D\u6E45\u6E62\u6E2B\u6E3F\u6E41\u6E5D\u6E73\u6E1C\u6E33\u6E4B\u6E40\u6E51\u6E3B\u6E03\u6E2E\u6E5E\u6E68\u6E5C\u6E61\u6E31\u6E28\u6E60\u6E71\u6E6B\u6E39\u6E22\u6E30\u6E53\u6E65\u6E27\u6E78\u6E64\u6E77\u6E55\u6E79\u6E52\u6E66\u6E35\u6E36\u6E5A\u7120\u711E\u712F\u70FB\u712E\u7131\u7123\u7125\u7122\u7132\u711F\u7128\u713A\u711B\u724B\u725A\u7288\u7289\u7286\u7285\u728B\u7312\u730B\u7330\u7322\u7331\u7333\u7327\u7332\u732D\u7326\u7323\u7335\u730C\u742E\u742C\u7430\u742B\u7416\u741A\u7421\u742D\u7431\u7424\u7423\u741D\u7429\u7420\u7432\u74FB\u752F\u756F\u756C\u75E7\u75DA\u75E1\u75E6\u75DD\u75DF\u75E4\u75D7\u7695\u7692\u76DA\u7746\u7747\u7744\u774D\u7745\u774A\u774E\u774B\u774C\u77DE\u77EC\u7860\u7864\u7865\u785C\u786D\u7871\u786A\u786E\u7870\u7869\u7868\u785E\u7862\u7974\u7973\u7972\u7970\u7A02\u7A0A\u7A03\u7A0C\u7A04\u7A99\u7AE6\u7AE4\u7B4A\u7B3B\u7B44\u7B48\u7B4C\u7B4E\u7B40\u7B58\u7B45\u7CA2\u7C9E\u7CA8\u7CA1\u7D58\u7D6F\u7D63\u7D53\u7D56\u7D67\u7D6A\u7D4F\u7D6D\u7D5C\u7D6B\u7D52\u7D54\u7D69\u7D51\u7D5F\u7D4E\u7F3E\u7F3F\u7F65\u7F66\u7FA2\u7FA0\u7FA1\u7FD7\u8051\u804F\u8050\u80FE\u80D4\u8143\u814A\u8152\u814F\u8147\u813D\u814D\u813A\u81E6\u81EE\u81F7\u81F8\u81F9\u8204\u823C\u823D\u823F\u8275\u833B\u83F9\u8423\u83C0\u83E8\u8412\u83E7\u83E4\u83FC\u83F6\u8410\u83C6\u83C8\u83EB\u83E3\u83BF\u8401\u83DD\u83E5\u83D8\u83FF\u83E1\u83CB\u83CE\u83D6\u83F5\u83C9\u8409\u83DE\u8411\u8406\u83C2\u83F3\u83D5\u83FA\u83C7\u83D1\u83EA\u8413\u83C3\u83EC\u83EE\u83C4\u83FB\u83D7\u83E2\u841B\u83DB\u83FE\u86D8\u86E2\u86E6\u86D3\u86E3\u86DA\u86EA\u86DD\u86EB\u86DC\u86EC\u86E9\u86D7\u86E8\u86D1\u8848\u8856\u8855\u88BA\u88D7\u88B9\u88B8\u88C0\u88BE\u88B6\u88BC\u88B7\u88BD\u88B2\u8901\u88C9\u8995\u8998\u8997\u89DD\u89DA\u89DB\u8A4E\u8A4D\u8A39\u8A59\u8A40\u8A57\u8A58\u8A44\u8A45\u8A52\u8A48\u8A51\u8A4A\u8A4C\u8A4F\u8C5F\u8C81\u8C80\u8CBA\u8CBE\u8CB0\u8CB9\u8CB5\u8D84\u8D80\u8D89\u8DD8\u8DD3\u8DCD\u8DC7\u8DD6\u8DDC\u8DCF\u8DD5\u8DD9\u8DC8\u8DD7\u8DC5\u8EEF\u8EF7\u8EFA\u8EF9\u8EE6\u8EEE\u8EE5\u8EF5\u8EE7\u8EE8\u8EF6\u8EEB\u8EF1\u8EEC\u8EF4\u8EE9\u902D\u9034\u902F\u9106\u912C\u90FF\u90FC\u9108\u90F9\u90FB\u9101\u9100\u9107\u9105\u9103\u9161\u9164\u915F\u9162\u9160\u9201\u920A\u9225\u9203\u921A\u9226\u920F\u920C\u9200\u9212\u91FF\u91FD\u9206\u9204\u9227\u9202\u921C\u9224\u9219\u9217\u9205\u9216\u957B\u958D\u958C\u9590\u9687\u967E\u9688\u9689\u9683\u9680\u96C2\u96C8\u96C3\u96F1\u96F0\u976C\u9770\u976E\u9807\u98A9\u98EB\u9CE6\u9EF9\u4E83\u4E84\u4EB6\u50BD\u50BF\u50C6\u50AE\u50C4\u50CA\u50B4\u50C8\u50C2\u50B0\u50C1\u50BA\u50B1\u50CB\u50C9\u50B6\u50B8\u51D7\u527A\u5278\u527B\u527C\u55C3\u55DB\u55CC\u55D0\u55CB\u55CA\u55DD\u55C0\u55D4\u55C4\u55E9\u55BF\u55D2\u558D\u55CF\u55D5\u55E2\u55D6\u55C8\u55F2\u55CD\u55D9\u55C2\u5714\u5853\u5868\u5864\u584F\u584D\u5849\u586F\u5855\u584E\u585D\u5859\u5865\u585B\u583D\u5863\u5871\u58FC\u5AC7\u5AC4\u5ACB\u5ABA\u5AB8\u5AB1\u5AB5\u5AB0\u5ABF\u5AC8\u5ABB\u5AC6\u5AB7\u5AC0\u5ACA\u5AB4\u5AB6\u5ACD\u5AB9\u5A90\u5BD6\u5BD8\u5BD9\u5C1F\u5C33\u5D71\u5D63\u5D4A\u5D65\u5D72\u5D6C\u5D5E\u5D68\u5D67\u5D62\u5DF0\u5E4F\u5E4E\u5E4A\u5E4D\u5E4B\u5EC5\u5ECC\u5EC6\u5ECB\u5EC7\u5F40\u5FAF\u5FAD\u60F7\u6149\u614A\u612B\u6145\u6136\u6132\u612E\u6146\u612F\u614F\u6129\u6140\u6220\u9168\u6223\u6225\u6224\u63C5\u63F1\u63EB\u6410\u6412\u6409\u6420\u6424\u6433\u6443\u641F\u6415\u6418\u6439\u6437\u6422\u6423\u640C\u6426\u6430\u6428\u6441\u6435\u642F\u640A\u641A\u6440\u6425\u6427\u640B\u63E7\u641B\u642E\u6421\u640E\u656F\u6592\u65D3\u6686\u668C\u6695\u6690\u668B\u668A\u6699\u6694\u6678\u6720\u6966\u695F\u6938\u694E\u6962\u6971\u693F\u6945\u696A\u6939\u6942\u6957\u6959\u697A\u6948\u6949\u6935\u696C\u6933\u693D\u6965\u68F0\u6978\u6934\u6969\u6940\u696F\u6944\u6976\u6958\u6941\u6974\u694C\u693B\u694B\u6937\u695C\u694F\u6951\u6932\u6952\u692F\u697B\u693C\u6B46\u6B45\u6B43\u6B42\u6B48\u6B41\u6B9B\uFA0D\u6BFB\u6BFC\u6BF9\u6BF7\u6BF8\u6E9B\u6ED6\u6EC8\u6E8F\u6EC0\u6E9F\u6E93\u6E94\u6EA0\u6EB1\u6EB9\u6EC6\u6ED2\u6EBD\u6EC1\u6E9E\u6EC9\u6EB7\u6EB0\u6ECD\u6EA6\u6ECF\u6EB2\u6EBE\u6EC3\u6EDC\u6ED8\u6E99\u6E92\u6E8E\u6E8D\u6EA4\u6EA1\u6EBF\u6EB3\u6ED0\u6ECA\u6E97\u6EAE\u6EA3\u7147\u7154\u7152\u7163\u7160\u7141\u715D\u7172\u7178\u716A\u7161\u7142\u7158\u7143\u714B\u7170\u715F\u7150\u7153\u7144\u714D\u715A\u724F\u728D\u728C\u7291\u7290\u728E\u733C\u7342\u733B\u733A\u7340\u734A\u7349\u7444\u744A\u744B\u7452\u7451\u7457\u7440\u744F\u7450\u744E\u7442\u7446\u744D\u7454\u74E1\u74FF\u74FE\u74FD\u751D\u7579\u7577\u6983\u75EF\u760F\u7603\u75F7\u75FE\u75FC\u75F8\u7610\u75FB\u75F6\u75ED\u75F5\u75FD\u7699\u76B5\u76DD\u7755\u775F\u7760\u7752\u7756\u775A\u7769\u7767\u7754\u7759\u776D\u77E0\u7887\u789A\u7894\u788F\u7884\u7895\u7885\u7886\u78A1\u7883\u7879\u7899\u7880\u7896\u787B\u797C\u7982\u797D\u7979\u7A11\u7A18\u7A19\u7A12\u7A17\u7A15\u7A22\u7A13\u7A1B\u7A10\u7AA3\u7AA2\u7A9E\u7AEB\u7B66\u7B64\u7B6D\u7B74\u7B69\u7B72\u7B65\u7B73\u7B71\u7B70\u7B61\u7B78\u7B76\u7B63\u7CB2\u7CB4\u7CAF\u7D88\u7D86\u7D80\u7D8D\u7D7F\u7D85\u7D7A\u7D8E\u7D7B\u7D83\u7D7C\u7D8C\u7D94\u7D84\u7D7D\u7D92\u7F6D\u7F6B\u7F67\u7F68\u7F6C\u7FA6\u7FA5\u7FA7\u7FDB\u7FDC\u8021\u8164\u8160\u8177\u815C\u8169\u815B\u8162\u8172\u6721\u815E\u8176\u8167\u816F\u8144\u8161\u821D\u8249\u8244\u8240\u8242\u8245\u84F1\u843F\u8456\u8476\u8479\u848F\u848D\u8465\u8451\u8440\u8486\u8467\u8430\u844D\u847D\u845A\u8459\u8474\u8473\u845D\u8507\u845E\u8437\u843A\u8434\u847A\u8443\u8478\u8432\u8445\u8429\u83D9\u844B\u842F\u8442\u842D\u845F\u8470\u8439\u844E\u844C\u8452\u846F\u84C5\u848E\u843B\u8447\u8436\u8433\u8468\u847E\u8444\u842B\u8460\u8454\u846E\u8450\u870B\u8704\u86F7\u870C\u86FA\u86D6\u86F5\u874D\u86F8\u870E\u8709\u8701\u86F6\u870D\u8705\u88D6\u88CB\u88CD\u88CE\u88DE\u88DB\u88DA\u88CC\u88D0\u8985\u899B\u89DF\u89E5\u89E4\u89E1\u89E0\u89E2\u89DC\u89E6\u8A76\u8A86\u8A7F\u8A61\u8A3F\u8A77\u8A82\u8A84\u8A75\u8A83\u8A81\u8A74\u8A7A\u8C3C\u8C4B\u8C4A\u8C65\u8C64\u8C66\u8C86\u8C84\u8C85\u8CCC\u8D68\u8D69\u8D91\u8D8C\u8D8E\u8D8F\u8D8D\u8D93\u8D94\u8D90\u8D92\u8DF0\u8DE0\u8DEC\u8DF1\u8DEE\u8DD0\u8DE9\u8DE3\u8DE2\u8DE7\u8DF2\u8DEB\u8DF4\u8F06\u8EFF\u8F01\u8F00\u8F05\u8F07\u8F08\u8F02\u9052\u903F\u9044\u9049\u903D\u9110\u910D\u910F\u9111\u9116\u9114\u910B\u910E\u916E\u916F\u9248\u9252\u9230\u923A\u9266\u9233\u9265\u925E\u9283\u922E\u924A\u9246\u926D\u926C\u924F\u9260\u9267\u926F\u9236\u9261\u9270\u9231\u9254\u9263\u9250\u9272\u924E\u9253\u924C\u9256\u9232\u959F\u959C\u959E\u959B\u9692\u9693\u9691\u9697\u96CE\u96FA\u96FD\u96F8\u96F5\u9773\u9777\u9778\u9772\u980F\u980D\u980E\u98AC\u98F6\u98F9\u99AF\u99B2\u99B0\u99B5\u9AAD\u9AAB\u9B5B\u9CEA\u9CED\u9CE7\u9E80\u9EFD\u50E6\u50D4\u50D7\u50E8\u50F3\u50DB\u50EA\u50DD\u50E4\u50D3\u50EC\u50F0\u50EF\u50E3\u50E0\u51D8\u5280\u5281\u52E9\u52EB\u5330\u53AC\u5627\u5615\u560C\u5612\u55FC\u560F\u561C\u5601\u5613\u5602\u55FA\u561D\u5604\u55FF\u55F9\u5889\u587C\u5890\u5898\u5886\u5881\u587F\u5874\u588B\u587A\u5887\u5891\u588E\u5876\u5882\u5888\u587B\u5894\u588F\u58FE\u596B\u5ADC\u5AEE\u5AE5\u5AD5\u5AEA\u5ADA\u5AED\u5AEB\u5AF3\u5AE2\u5AE0\u5ADB\u5AEC\u5ADE\u5ADD\u5AD9\u5AE8\u5ADF\u5B77\u5BE0\u5BE3\u5C63\u5D82\u5D80\u5D7D\u5D86\u5D7A\u5D81\u5D77\u5D8A\u5D89\u5D88\u5D7E\u5D7C\u5D8D\u5D79\u5D7F\u5E58\u5E59\u5E53\u5ED8\u5ED1\u5ED7\u5ECE\u5EDC\u5ED5\u5ED9\u5ED2\u5ED4\u5F44\u5F43\u5F6F\u5FB6\u612C\u6128\u6141\u615E\u6171\u6173\u6152\u6153\u6172\u616C\u6180\u6174\u6154\u617A\u615B\u6165\u613B\u616A\u6161\u6156\u6229\u6227\u622B\u642B\u644D\u645B\u645D\u6474\u6476\u6472\u6473\u647D\u6475\u6466\u64A6\u644E\u6482\u645E\u645C\u644B\u6453\u6460\u6450\u647F\u643F\u646C\u646B\u6459\u6465\u6477\u6573\u65A0\u66A1\u66A0\u669F\u6705\u6704\u6722\u69B1\u69B6\u69C9\u69A0\u69CE\u6996\u69B0\u69AC\u69BC\u6991\u6999\u698E\u69A7\u698D\u69A9\u69BE\u69AF\u69BF\u69C4\u69BD\u69A4\u69D4\u69B9\u69CA\u699A\u69CF\u69B3\u6993\u69AA\u69A1\u699E\u69D9\u6997\u6990\u69C2\u69B5\u69A5\u69C6\u6B4A\u6B4D\u6B4B\u6B9E\u6B9F\u6BA0\u6BC3\u6BC4\u6BFE\u6ECE\u6EF5\u6EF1\u6F03\u6F25\u6EF8\u6F37\u6EFB\u6F2E\u6F09\u6F4E\u6F19\u6F1A\u6F27\u6F18\u6F3B\u6F12\u6EED\u6F0A\u6F36\u6F73\u6EF9\u6EEE\u6F2D\u6F40\u6F30\u6F3C\u6F35\u6EEB\u6F07\u6F0E\u6F43\u6F05\u6EFD\u6EF6\u6F39\u6F1C\u6EFC\u6F3A\u6F1F\u6F0D\u6F1E\u6F08\u6F21\u7187\u7190\u7189\u7180\u7185\u7182\u718F\u717B\u7186\u7181\u7197\u7244\u7253\u7297\u7295\u7293\u7343\u734D\u7351\u734C\u7462\u7473\u7471\u7475\u7472\u7467\u746E\u7500\u7502\u7503\u757D\u7590\u7616\u7608\u760C\u7615\u7611\u760A\u7614\u76B8\u7781\u777C\u7785\u7782\u776E\u7780\u776F\u777E\u7783\u78B2\u78AA\u78B4\u78AD\u78A8\u787E\u78AB\u789E\u78A5\u78A0\u78AC\u78A2\u78A4\u7998\u798A\u798B\u7996\u7995\u7994\u7993\u7997\u7988\u7992\u7990\u7A2B\u7A4A\u7A30\u7A2F\u7A28\u7A26\u7AA8\u7AAB\u7AAC\u7AEE\u7B88\u7B9C\u7B8A\u7B91\u7B90\u7B96\u7B8D\u7B8C\u7B9B\u7B8E\u7B85\u7B98\u5284\u7B99\u7BA4\u7B82\u7CBB\u7CBF\u7CBC\u7CBA\u7DA7\u7DB7\u7DC2\u7DA3\u7DAA\u7DC1\u7DC0\u7DC5\u7D9D\u7DCE\u7DC4\u7DC6\u7DCB\u7DCC\u7DAF\u7DB9\u7D96\u7DBC\u7D9F\u7DA6\u7DAE\u7DA9\u7DA1\u7DC9\u7F73\u7FE2\u7FE3\u7FE5\u7FDE\u8024\u805D\u805C\u8189\u8186\u8183\u8187\u818D\u818C\u818B\u8215\u8497\u84A4\u84A1\u849F\u84BA\u84CE\u84C2\u84AC\u84AE\u84AB\u84B9\u84B4\u84C1\u84CD\u84AA\u849A\u84B1\u84D0\u849D\u84A7\u84BB\u84A2\u8494\u84C7\u84CC\u849B\u84A9\u84AF\u84D6\u8498\u84B6\u84CF\u84A0\u84D7\u84D4\u84D2\u84DB\u84B0\u8491\u8661\u8733\u8723\u8728\u876B\u8740\u872E\u871E\u8721\u8719\u871B\u8743\u872C\u8741\u873E\u8746\u8720\u8732\u872A\u872D\u873C\u8712\u873A\u8731\u8735\u8742\u8726\u8727\u8738\u8724\u871A\u8730\u8711\u88F7\u88E7\u88F1\u88F2\u88FA\u88FE\u88EE\u88FC\u88F6\u88FB\u88F0\u88EC\u88EB\u899D\u89A1\u899F\u899E\u89E9\u89EB\u89E8\u8AAB\u8A99\u8A8B\u8A92\u8A8F\u8A96\u8C3D\u8C68\u8C69\u8CD5\u8CCF\u8CD7\u8D96\u8E09\u8E02\u8DFF\u8E0D\u8DFD\u8E0A\u8E03\u8E07\u8E06\u8E05\u8DFE\u8E00\u8E04\u8F10\u8F11\u8F0E\u8F0D\u9123\u911C\u9120\u9122\u911F\u911D\u911A\u9124\u9121\u911B\u917A\u9172\u9179\u9173\u92A5\u92A4\u9276\u929B\u927A\u92A0\u9294\u92AA\u928D\u92A6\u929A\u92AB\u9279\u9297\u927F\u92A3\u92EE\u928E\u9282\u9295\u92A2\u927D\u9288\u92A1\u928A\u9286\u928C\u9299\u92A7\u927E\u9287\u92A9\u929D\u928B\u922D\u969E\u96A1\u96FF\u9758\u977D\u977A\u977E\u9783\u9780\u9782\u977B\u9784\u9781\u977F\u97CE\u97CD\u9816\u98AD\u98AE\u9902\u9900\u9907\u999D\u999C\u99C3\u99B9\u99BB\u99BA\u99C2\u99BD\u99C7\u9AB1\u9AE3\u9AE7\u9B3E\u9B3F\u9B60\u9B61\u9B5F\u9CF1\u9CF2\u9CF5\u9EA7\u50FF\u5103\u5130\u50F8\u5106\u5107\u50F6\u50FE\u510B\u510C\u50FD\u510A\u528B\u528C\u52F1\u52EF\u5648\u5642\u564C\u5635\u5641\u564A\u5649\u5646\u5658\u565A\u5640\u5633\u563D\u562C\u563E\u5638\u562A\u563A\u571A\u58AB\u589D\u58B1\u58A0\u58A3\u58AF\u58AC\u58A5\u58A1\u58FF\u5AFF\u5AF4\u5AFD\u5AF7\u5AF6\u5B03\u5AF8\u5B02\u5AF9\u5B01\u5B07\u5B05\u5B0F\u5C67\u5D99\u5D97\u5D9F\u5D92\u5DA2\u5D93\u5D95\u5DA0\u5D9C\u5DA1\u5D9A\u5D9E\u5E69\u5E5D\u5E60\u5E5C\u7DF3\u5EDB\u5EDE\u5EE1\u5F49\u5FB2\u618B\u6183\u6179\u61B1\u61B0\u61A2\u6189\u619B\u6193\u61AF\u61AD\u619F\u6192\u61AA\u61A1\u618D\u6166\u61B3\u622D\u646E\u6470\u6496\u64A0\u6485\u6497\u649C\u648F\u648B\u648A\u648C\u64A3\u649F\u6468\u64B1\u6498\u6576\u657A\u6579\u657B\u65B2\u65B3\u66B5\u66B0\u66A9\u66B2\u66B7\u66AA\u66AF\u6A00\u6A06\u6A17\u69E5\u69F8\u6A15\u69F1\u69E4\u6A20\u69FF\u69EC\u69E2\u6A1B\u6A1D\u69FE\u6A27\u69F2\u69EE\u6A14\u69F7\u69E7\u6A40\u6A08\u69E6\u69FB\u6A0D\u69FC\u69EB\u6A09\u6A04\u6A18\u6A25\u6A0F\u69F6\u6A26\u6A07\u69F4\u6A16\u6B51\u6BA5\u6BA3\u6BA2\u6BA6\u6C01\u6C00\u6BFF\u6C02\u6F41\u6F26\u6F7E\u6F87\u6FC6\u6F92\u6F8D\u6F89\u6F8C\u6F62\u6F4F\u6F85\u6F5A\u6F96\u6F76\u6F6C\u6F82\u6F55\u6F72\u6F52\u6F50\u6F57\u6F94\u6F93\u6F5D\u6F00\u6F61\u6F6B\u6F7D\u6F67\u6F90\u6F53\u6F8B\u6F69\u6F7F\u6F95\u6F63\u6F77\u6F6A\u6F7B\u71B2\u71AF\u719B\u71B0\u71A0\u719A\u71A9\u71B5\u719D\u71A5\u719E\u71A4\u71A1\u71AA\u719C\u71A7\u71B3\u7298\u729A\u7358\u7352\u735E\u735F\u7360\u735D\u735B\u7361\u735A\u7359\u7362\u7487\u7489\u748A\u7486\u7481\u747D\u7485\u7488\u747C\u7508\u7507\u757E\u7625\u761E\u7619\u761D\u761C\u7623\u761A\u7628\u761B\u769C\u769D\u769E\u769B\u778D\u778F\u7789\u7788\u78CD\u78BB\u78CF\u78CC\u78D1\u78CE\u78D4\u78C8\u78C3\u78C4\u78C9\u799A\u79A1\u79A0\u799C\u79A2\u6B76\u7A39\u7AB2\u7AB4\u7AB3\u7BB7\u7BCB\u7BBE\u7BAC\u7BCE\u7BAF\u7BB9\u7BCA\u7BB5\u7CC5\u7CC8\u7CCC\u7CCB\u7DF7\u7DDB\u7DEA\u7DE7\u7DD7\u7DE1\u7E03\u7DFA\u7DE6\u7DF6\u7DF1\u7DF0\u7DEE\u7DDF\u7F76\u7FAC\u7FB0\u7FAD\u7FED\u7FEB\u7FEA\u7FEC\u7FE6\u7FE8\u8064\u8067\u81A3\u819F\u819E\u8195\u81A2\u8199\u8197\u8216\u824F\u8253\u8252\u8250\u824E\u8251\u8524\u853B\u850F\u8500\u8529\u850E\u8509\u850D\u851F\u850A\u8527\u851C\u84FB\u852B\u84FA\u8508\u850C\u84F4\u852A\u84F2\u8515\u84F7\u84EB\u84F3\u84FC\u8512\u84EA\u84E9\u8516\u84FE\u8528\u851D\u852E\u8502\u84FD\u851E\u84F6\u8531\u8526\u84E7\u84E8\u84F0\u84EF\u84F9\u8518\u8520\u8530\u850B\u8519\u852F\u8662\u8756\u8763\u8764\u8777\u87E1\u8773\u8758\u8754\u875B\u8752\u8761\u875A\u8751\u875E\u876D\u876A\u8750\u874E\u875F\u875D\u876F\u876C\u877A\u876E\u875C\u8765\u874F\u877B\u8775\u8762\u8767\u8769\u885A\u8905\u890C\u8914\u890B\u8917\u8918\u8919\u8906\u8916\u8911\u890E\u8909\u89A2\u89A4\u89A3\u89ED\u89F0\u89EC\u8ACF\u8AC6\u8AB8\u8AD3\u8AD1\u8AD4\u8AD5\u8ABB\u8AD7\u8ABE\u8AC0\u8AC5\u8AD8\u8AC3\u8ABA\u8ABD\u8AD9\u8C3E\u8C4D\u8C8F\u8CE5\u8CDF\u8CD9\u8CE8\u8CDA\u8CDD\u8CE7\u8DA0\u8D9C\u8DA1\u8D9B\u8E20\u8E23\u8E25\u8E24\u8E2E\u8E15\u8E1B\u8E16\u8E11\u8E19\u8E26\u8E27\u8E14\u8E12\u8E18\u8E13\u8E1C\u8E17\u8E1A\u8F2C\u8F24\u8F18\u8F1A\u8F20\u8F23\u8F16\u8F17\u9073\u9070\u906F\u9067\u906B\u912F\u912B\u9129\u912A\u9132\u9126\u912E\u9185\u9186\u918A\u9181\u9182\u9184\u9180\u92D0\u92C3\u92C4\u92C0\u92D9\u92B6\u92CF\u92F1\u92DF\u92D8\u92E9\u92D7\u92DD\u92CC\u92EF\u92C2\u92E8\u92CA\u92C8\u92CE\u92E6\u92CD\u92D5\u92C9\u92E0\u92DE\u92E7\u92D1\u92D3\u92B5\u92E1\u92C6\u92B4\u957C\u95AC\u95AB\u95AE\u95B0\u96A4\u96A2\u96D3\u9705\u9708\u9702\u975A\u978A\u978E\u9788\u97D0\u97CF\u981E\u981D\u9826\u9829\u9828\u9820\u981B\u9827\u98B2\u9908\u98FA\u9911\u9914\u9916\u9917\u9915\u99DC\u99CD\u99CF\u99D3\u99D4\u99CE\u99C9\u99D8\u99CB\u99D7\u99CC\u9AB3\u9AEC\u9AEB\u9AF3\u9AF2\u9AF1\u9B46\u9B43\u9B67\u9B74\u9B71\u9B66\u9B76\u9B75\u9B70\u9B68\u9B64\u9B6C\u9CFC\u9CFA\u9CFD\u9CFF\u9CF7\u9D07\u9D00\u9CF9\u9CFB\u9D08\u9D05\u9D04\u9E83\u9ED3\u9F0F\u9F10\u511C\u5113\u5117\u511A\u5111\u51DE\u5334\u53E1\u5670\u5660\u566E\u5673\u5666\u5663\u566D\u5672\u565E\u5677\u571C\u571B\u58C8\u58BD\u58C9\u58BF\u58BA\u58C2\u58BC\u58C6\u5B17\u5B19\u5B1B\u5B21\u5B14\u5B13\u5B10\u5B16\u5B1A\u5B20\u5B1E\u5BEF\u5DAC\u5DB1\u5DA9\u5DA7\u5DB5\u5DB0\u5DAE\u5DAA\u5DA8\u5DB2\u5DAD\u5DAF\u5DB4\u5E67\u5E68\u5E66\u5E6F\u5EE9\u5EE7\u5EE6\u5EE8\u5EE5\u5F4B\u5FBC\u619D\u61A8\u6196\u61C5\u61B4\u61C6\u61C1\u61CC\u61BA\u61BF\u61B8\u618C\u64D7\u64D6\u64D0\u64CF\u64C9\u64BD\u6489\u64C3\u64DB\u64F3\u64D9\u6533\u657F\u657C\u65A2\u66C8\u66BE\u66C0\u66CA\u66CB\u66CF\u66BD\u66BB\u66BA\u66CC\u6723\u6A34\u6A66\u6A49\u6A67\u6A32\u6A68\u6A3E\u6A5D\u6A6D\u6A76\u6A5B\u6A51\u6A28\u6A5A\u6A3B\u6A3F\u6A41\u6A6A\u6A64\u6A50\u6A4F\u6A54\u6A6F\u6A69\u6A60\u6A3C\u6A5E\u6A56\u6A55\u6A4D\u6A4E\u6A46\u6B55\u6B54\u6B56\u6BA7\u6BAA\u6BAB\u6BC8\u6BC7\u6C04\u6C03\u6C06\u6FAD\u6FCB\u6FA3\u6FC7\u6FBC\u6FCE\u6FC8\u6F5E\u6FC4\u6FBD\u6F9E\u6FCA\u6FA8\u7004\u6FA5\u6FAE\u6FBA\u6FAC\u6FAA\u6FCF\u6FBF\u6FB8\u6FA2\u6FC9\u6FAB\u6FCD\u6FAF\u6FB2\u6FB0\u71C5\u71C2\u71BF\u71B8\u71D6\u71C0\u71C1\u71CB\u71D4\u71CA\u71C7\u71CF\u71BD\u71D8\u71BC\u71C6\u71DA\u71DB\u729D\u729E\u7369\u7366\u7367\u736C\u7365\u736B\u736A\u747F\u749A\u74A0\u7494\u7492\u7495\u74A1\u750B\u7580\u762F\u762D\u7631\u763D\u7633\u763C\u7635\u7632\u7630\u76BB\u76E6\u779A\u779D\u77A1\u779C\u779B\u77A2\u77A3\u7795\u7799\u7797\u78DD\u78E9\u78E5\u78EA\u78DE\u78E3\u78DB\u78E1\u78E2\u78ED\u78DF\u78E0\u79A4\u7A44\u7A48\u7A47\u7AB6\u7AB8\u7AB5\u7AB1\u7AB7\u7BDE\u7BE3\u7BE7\u7BDD\u7BD5\u7BE5\u7BDA\u7BE8\u7BF9\u7BD4\u7BEA\u7BE2\u7BDC\u7BEB\u7BD8\u7BDF\u7CD2\u7CD4\u7CD7\u7CD0\u7CD1\u7E12\u7E21\u7E17\u7E0C\u7E1F\u7E20\u7E13\u7E0E\u7E1C\u7E15\u7E1A\u7E22\u7E0B\u7E0F\u7E16\u7E0D\u7E14\u7E25\u7E24\u7F43\u7F7B\u7F7C\u7F7A\u7FB1\u7FEF\u802A\u8029\u806C\u81B1\u81A6\u81AE\u81B9\u81B5\u81AB\u81B0\u81AC\u81B4\u81B2\u81B7\u81A7\u81F2\u8255\u8256\u8257\u8556\u8545\u856B\u854D\u8553\u8561\u8558\u8540\u8546\u8564\u8541\u8562\u8544\u8551\u8547\u8563\u853E\u855B\u8571\u854E\u856E\u8575\u8555\u8567\u8560\u858C\u8566\u855D\u8554\u8565\u856C\u8663\u8665\u8664\u879B\u878F\u8797\u8793\u8792\u8788\u8781\u8796\u8798\u8779\u8787\u87A3\u8785\u8790\u8791\u879D\u8784\u8794\u879C\u879A\u8789\u891E\u8926\u8930\u892D\u892E\u8927\u8931\u8922\u8929\u8923\u892F\u892C\u891F\u89F1\u8AE0\u8AE2\u8AF2\u8AF4\u8AF5\u8ADD\u8B14\u8AE4\u8ADF\u8AF0\u8AC8\u8ADE\u8AE1\u8AE8\u8AFF\u8AEF\u8AFB\u8C91\u8C92\u8C90\u8CF5\u8CEE\u8CF1\u8CF0\u8CF3\u8D6C\u8D6E\u8DA5\u8DA7\u8E33\u8E3E\u8E38\u8E40\u8E45\u8E36\u8E3C\u8E3D\u8E41\u8E30\u8E3F\u8EBD\u8F2E\u8F35\u8F32\u8F39\u8F37\u8F34\u9076\u9079\u907B\u9086\u90FA\u9133\u9135\u9136\u9193\u9190\u9191\u918D\u918F\u9327\u931E\u9308\u931F\u9306\u930F\u937A\u9338\u933C\u931B\u9323\u9312\u9301\u9346\u932D\u930E\u930D\u92CB\u931D\u92FA\u9325\u9313\u92F9\u92F7\u9334\u9302\u9324\u92FF\u9329\u9339\u9335\u932A\u9314\u930C\u930B\u92FE\u9309\u9300\u92FB\u9316\u95BC\u95CD\u95BE\u95B9\u95BA\u95B6\u95BF\u95B5\u95BD\u96A9\u96D4\u970B\u9712\u9710\u9799\u9797\u9794\u97F0\u97F8\u9835\u982F\u9832\u9924\u991F\u9927\u9929\u999E\u99EE\u99EC\u99E5\u99E4\u99F0\u99E3\u99EA\u99E9\u99E7\u9AB9\u9ABF\u9AB4\u9ABB\u9AF6\u9AFA\u9AF9\u9AF7\u9B33\u9B80\u9B85\u9B87\u9B7C\u9B7E\u9B7B\u9B82\u9B93\u9B92\u9B90\u9B7A\u9B95\u9B7D\u9B88\u9D25\u9D17\u9D20\u9D1E\u9D14\u9D29\u9D1D\u9D18\u9D22\u9D10\u9D19\u9D1F\u9E88\u9E86\u9E87\u9EAE\u9EAD\u9ED5\u9ED6\u9EFA\u9F12\u9F3D\u5126\u5125\u5122\u5124\u5120\u5129\u52F4\u5693\u568C\u568D\u5686\u5684\u5683\u567E\u5682\u567F\u5681\u58D6\u58D4\u58CF\u58D2\u5B2D\u5B25\u5B32\u5B23\u5B2C\u5B27\u5B26\u5B2F\u5B2E\u5B7B\u5BF1\u5BF2\u5DB7\u5E6C\u5E6A\u5FBE\u5FBB\u61C3\u61B5\u61BC\u61E7\u61E0\u61E5\u61E4\u61E8\u61DE\u64EF\u64E9\u64E3\u64EB\u64E4\u64E8\u6581\u6580\u65B6\u65DA\u66D2\u6A8D\u6A96\u6A81\u6AA5\u6A89\u6A9F\u6A9B\u6AA1\u6A9E\u6A87\u6A93\u6A8E\u6A95\u6A83\u6AA8\u6AA4\u6A91\u6A7F\u6AA6\u6A9A\u6A85\u6A8C\u6A92\u6B5B\u6BAD\u6C09\u6FCC\u6FA9\u6FF4\u6FD4\u6FE3\u6FDC\u6FED\u6FE7\u6FE6\u6FDE\u6FF2\u6FDD\u6FE2\u6FE8\u71E1\u71F1\u71E8\u71F2\u71E4\u71F0\u71E2\u7373\u736E\u736F\u7497\u74B2\u74AB\u7490\u74AA\u74AD\u74B1\u74A5\u74AF\u7510\u7511\u7512\u750F\u7584\u7643\u7648\u7649\u7647\u76A4\u76E9\u77B5\u77AB\u77B2\u77B7\u77B6\u77B4\u77B1\u77A8\u77F0\u78F3\u78FD\u7902\u78FB\u78FC\u78F2\u7905\u78F9\u78FE\u7904\u79AB\u79A8\u7A5C\u7A5B\u7A56\u7A58\u7A54\u7A5A\u7ABE\u7AC0\u7AC1\u7C05\u7C0F\u7BF2\u7C00\u7BFF\u7BFB\u7C0E\u7BF4\u7C0B\u7BF3\u7C02\u7C09\u7C03\u7C01\u7BF8\u7BFD\u7BF0\u7BF1\u7C10\u7C0A\u7CE8\u7E2D\u7E3C\u7E42\u7E33\u9848\u7E38\u7E2A\u7E49\u7E40\u7E47\u7E29\u7E4C\u7E30\u7E3B\u7E36\u7E44\u7E3A\u7F45\u7F7F\u7F7E\u7F7D\u7FF4\u7FF2\u802C\u81BB\u81C4\u81CC\u81CA\u81C5\u81C7\u81BC\u81E9\u825B\u825A\u825C\u8583\u8580\u858F\u85A7\u8595\u85A0\u858B\u85A3\u857B\u85A4\u859A\u859E\u8577\u857C\u8589\u85A1\u857A\u8578\u8557\u858E\u8596\u8586\u858D\u8599\u859D\u8581\u85A2\u8582\u8588\u8585\u8579\u8576\u8598\u8590\u859F\u8668\u87BE\u87AA\u87AD\u87C5\u87B0\u87AC\u87B9\u87B5\u87BC\u87AE\u87C9\u87C3\u87C2\u87CC\u87B7\u87AF\u87C4\u87CA\u87B4\u87B6\u87BF\u87B8\u87BD\u87DE\u87B2\u8935\u8933\u893C\u893E\u8941\u8952\u8937\u8942\u89AD\u89AF\u89AE\u89F2\u89F3\u8B1E\u8B18\u8B16\u8B11\u8B05\u8B0B\u8B22\u8B0F\u8B12\u8B15\u8B07\u8B0D\u8B08\u8B06\u8B1C\u8B13\u8B1A\u8C4F\u8C70\u8C72\u8C71\u8C6F\u8C95\u8C94\u8CF9\u8D6F\u8E4E\u8E4D\u8E53\u8E50\u8E4C\u8E47\u8F43\u8F40\u9085\u907E\u9138\u919A\u91A2\u919B\u9199\u919F\u91A1\u919D\u91A0\u93A1\u9383\u93AF\u9364\u9356\u9347\u937C\u9358\u935C\u9376\u9349\u9350\u9351\u9360\u936D\u938F\u934C\u936A\u9379\u9357\u9355\u9352\u934F\u9371\u9377\u937B\u9361\u935E\u9363\u9367\u9380\u934E\u9359\u95C7\u95C0\u95C9\u95C3\u95C5\u95B7\u96AE\u96B0\u96AC\u9720\u971F\u9718\u971D\u9719\u979A\u97A1\u979C\u979E\u979D\u97D5\u97D4\u97F1\u9841\u9844\u984A\u9849\u9845\u9843\u9925\u992B\u992C\u992A\u9933\u9932\u992F\u992D\u9931\u9930\u9998\u99A3\u99A1\u9A02\u99FA\u99F4\u99F7\u99F9\u99F8\u99F6\u99FB\u99FD\u99FE\u99FC\u9A03\u9ABE\u9AFE\u9AFD\u9B01\u9AFC\u9B48\u9B9A\u9BA8\u9B9E\u9B9B\u9BA6\u9BA1\u9BA5\u9BA4\u9B86\u9BA2\u9BA0\u9BAF\u9D33\u9D41\u9D67\u9D36\u9D2E\u9D2F\u9D31\u9D38\u9D30\u9D45\u9D42\u9D43\u9D3E\u9D37\u9D40\u9D3D\u7FF5\u9D2D\u9E8A\u9E89\u9E8D\u9EB0\u9EC8\u9EDA\u9EFB\u9EFF\u9F24\u9F23\u9F22\u9F54\u9FA0\u5131\u512D\u512E\u5698\u569C\u5697\u569A\u569D\u5699\u5970\u5B3C\u5C69\u5C6A\u5DC0\u5E6D\u5E6E\u61D8\u61DF\u61ED\u61EE\u61F1\u61EA\u61F0\u61EB\u61D6\u61E9\u64FF\u6504\u64FD\u64F8\u6501\u6503\u64FC\u6594\u65DB\u66DA\u66DB\u66D8\u6AC5\u6AB9\u6ABD\u6AE1\u6AC6\u6ABA\u6AB6\u6AB7\u6AC7\u6AB4\u6AAD\u6B5E\u6BC9\u6C0B\u7007\u700C\u700D\u7001\u7005\u7014\u700E\u6FFF\u7000\u6FFB\u7026\u6FFC\u6FF7\u700A\u71FF\u71F9\u7203\u71FD\u7376\u74B8\u74C0\u74B5\u74C1\u74BE\u74B6\u74BB\u74C2\u7514\u7513\u765C\u7664\u7659\u7650\u7653\u7657\u765A\u76A6\u76BD\u76EC\u77C2\u77BA\u78FF\u790C\u7913\u7914\u7909\u7910\u7912\u7911\u79AD\u79AC\u7A5F\u7C1C\u7C29\u7C19\u7C20\u7C1F\u7C2D\u7C1D\u7C26\u7C28\u7C22\u7C25\u7C30\u7E5C\u7E50\u7E56\u7E63\u7E58\u7E62\u7E5F\u7E51\u7E60\u7E57\u7E53\u7FB5\u7FB3\u7FF7\u7FF8\u8075\u81D1\u81D2\u81D0\u825F\u825E\u85B4\u85C6\u85C0\u85C3\u85C2\u85B3\u85B5\u85BD\u85C7\u85C4\u85BF\u85CB\u85CE\u85C8\u85C5\u85B1\u85B6\u85D2\u8624\u85B8\u85B7\u85BE\u8669\u87E7\u87E6\u87E2\u87DB\u87EB\u87EA\u87E5\u87DF\u87F3\u87E4\u87D4\u87DC\u87D3\u87ED\u87D8\u87E3\u87A4\u87D7\u87D9\u8801\u87F4\u87E8\u87DD\u8953\u894B\u894F\u894C\u8946\u8950\u8951\u8949\u8B2A\u8B27\u8B23\u8B33\u8B30\u8B35\u8B47\u8B2F\u8B3C\u8B3E\u8B31\u8B25\u8B37\u8B26\u8B36\u8B2E\u8B24\u8B3B\u8B3D\u8B3A\u8C42\u8C75\u8C99\u8C98\u8C97\u8CFE\u8D04\u8D02\u8D00\u8E5C\u8E62\u8E60\u8E57\u8E56\u8E5E\u8E65\u8E67\u8E5B\u8E5A\u8E61\u8E5D\u8E69\u8E54\u8F46\u8F47\u8F48\u8F4B\u9128\u913A\u913B\u913E\u91A8\u91A5\u91A7\u91AF\u91AA\u93B5\u938C\u9392\u93B7\u939B\u939D\u9389\u93A7\u938E\u93AA\u939E\u93A6\u9395\u9388\u9399\u939F\u938D\u93B1\u9391\u93B2\u93A4\u93A8\u93B4\u93A3\u93A5\u95D2\u95D3\u95D1\u96B3\u96D7\u96DA\u5DC2\u96DF\u96D8\u96DD\u9723\u9722\u9725\u97AC\u97AE\u97A8\u97AB\u97A4\u97AA\u97A2\u97A5\u97D7\u97D9\u97D6\u97D8\u97FA\u9850\u9851\u9852\u98B8\u9941\u993C\u993A\u9A0F\u9A0B\u9A09\u9A0D\u9A04\u9A11\u9A0A\u9A05\u9A07\u9A06\u9AC0\u9ADC\u9B08\u9B04\u9B05\u9B29\u9B35\u9B4A\u9B4C\u9B4B\u9BC7\u9BC6\u9BC3\u9BBF\u9BC1\u9BB5\u9BB8\u9BD3\u9BB6\u9BC4\u9BB9\u9BBD\u9D5C\u9D53\u9D4F\u9D4A\u9D5B\u9D4B\u9D59\u9D56\u9D4C\u9D57\u9D52\u9D54\u9D5F\u9D58\u9D5A\u9E8E\u9E8C\u9EDF\u9F01\u9F00\u9F25\u9F2B\u9F2A\u9F29\u9F28\u9F4C\u9F55\u5134\u5135\u5296\u52F7\u53B4\u56AB\u56AD\u56A6\u56A7\u56AA\u56AC\u58DA\u58DD\u58DB\u5912\u5B3D\u5B3E\u5B3F\u5DC3\u5E70\u5FBF\u61FB\u6507\u6510\u650D\u6509\u650C\u650E\u6584\u65DE\u65DD\u66DE\u6AE7\u6AE0\u6ACC\u6AD1\u6AD9\u6ACB\u6ADF\u6ADC\u6AD0\u6AEB\u6ACF\u6ACD\u6ADE\u6B60\u6BB0\u6C0C\u7019\u7027\u7020\u7016\u702B\u7021\u7022\u7023\u7029\u7017\u7024\u701C\u702A\u720C\u720A\u7207\u7202\u7205\u72A5\u72A6\u72A4\u72A3\u72A1\u74CB\u74C5\u74B7\u74C3\u7516\u7660\u77C9\u77CA\u77C4\u77F1\u791D\u791B\u7921\u791C\u7917\u791E\u79B0\u7A67\u7A68\u7C33\u7C3C\u7C39\u7C2C\u7C3B\u7CEC\u7CEA\u7E76\u7E75\u7E78\u7E70\u7E77\u7E6F\u7E7A\u7E72\u7E74\u7E68\u7F4B\u7F4A\u7F83\u7F86\u7FB7\u7FFD\u7FFE\u8078\u81D7\u81D5\u8264\u8261\u8263\u85EB\u85F1\u85ED\u85D9\u85E1\u85E8\u85DA\u85D7\u85EC\u85F2\u85F8\u85D8\u85DF\u85E3\u85DC\u85D1\u85F0\u85E6\u85EF\u85DE\u85E2\u8800\u87FA\u8803\u87F6\u87F7\u8809\u880C\u880B\u8806\u87FC\u8808\u87FF\u880A\u8802\u8962\u895A\u895B\u8957\u8961\u895C\u8958\u895D\u8959\u8988\u89B7\u89B6\u89F6\u8B50\u8B48\u8B4A\u8B40\u8B53\u8B56\u8B54\u8B4B\u8B55\u8B51\u8B42\u8B52\u8B57\u8C43\u8C77\u8C76\u8C9A\u8D06\u8D07\u8D09\u8DAC\u8DAA\u8DAD\u8DAB\u8E6D\u8E78\u8E73\u8E6A\u8E6F\u8E7B\u8EC2\u8F52\u8F51\u8F4F\u8F50\u8F53\u8FB4\u9140\u913F\u91B0\u91AD\u93DE\u93C7\u93CF\u93C2\u93DA\u93D0\u93F9\u93EC\u93CC\u93D9\u93A9\u93E6\u93CA\u93D4\u93EE\u93E3\u93D5\u93C4\u93CE\u93C0\u93D2\u93E7\u957D\u95DA\u95DB\u96E1\u9729\u972B\u972C\u9728\u9726\u97B3\u97B7\u97B6\u97DD\u97DE\u97DF\u985C\u9859\u985D\u9857\u98BF\u98BD\u98BB\u98BE\u9948\u9947\u9943\u99A6\u99A7\u9A1A\u9A15\u9A25\u9A1D\u9A24\u9A1B\u9A22\u9A20\u9A27\u9A23\u9A1E\u9A1C\u9A14\u9AC2\u9B0B\u9B0A\u9B0E\u9B0C\u9B37\u9BEA\u9BEB\u9BE0\u9BDE\u9BE4\u9BE6\u9BE2\u9BF0\u9BD4\u9BD7\u9BEC\u9BDC\u9BD9\u9BE5\u9BD5\u9BE1\u9BDA\u9D77\u9D81\u9D8A\u9D84\u9D88\u9D71\u9D80\u9D78\u9D86\u9D8B\u9D8C\u9D7D\u9D6B\u9D74\u9D75\u9D70\u9D69\u9D85\u9D73\u9D7B\u9D82\u9D6F\u9D79\u9D7F\u9D87\u9D68\u9E94\u9E91\u9EC0\u9EFC\u9F2D\u9F40\u9F41\u9F4D\u9F56\u9F57\u9F58\u5337\u56B2\u56B5\u56B3\u58E3\u5B45\u5DC6\u5DC7\u5EEE\u5EEF\u5FC0\u5FC1\u61F9\u6517\u6516\u6515\u6513\u65DF\u66E8\u66E3\u66E4\u6AF3\u6AF0\u6AEA\u6AE8\u6AF9\u6AF1\u6AEE\u6AEF\u703C\u7035\u702F\u7037\u7034\u7031\u7042\u7038\u703F\u703A\u7039\u7040\u703B\u7033\u7041\u7213\u7214\u72A8\u737D\u737C\u74BA\u76AB\u76AA\u76BE\u76ED\u77CC\u77CE\u77CF\u77CD\u77F2\u7925\u7923\u7927\u7928\u7924\u7929\u79B2\u7A6E\u7A6C\u7A6D\u7AF7\u7C49\u7C48\u7C4A\u7C47\u7C45\u7CEE\u7E7B\u7E7E\u7E81\u7E80\u7FBA\u7FFF\u8079\u81DB\u81D9\u820B\u8268\u8269\u8622\u85FF\u8601\u85FE\u861B\u8600\u85F6\u8604\u8609\u8605\u860C\u85FD\u8819\u8810\u8811\u8817\u8813\u8816\u8963\u8966\u89B9\u89F7\u8B60\u8B6A\u8B5D\u8B68\u8B63\u8B65\u8B67\u8B6D\u8DAE\u8E86\u8E88\u8E84\u8F59\u8F56\u8F57\u8F55\u8F58\u8F5A\u908D\u9143\u9141\u91B7\u91B5\u91B2\u91B3\u940B\u9413\u93FB\u9420\u940F\u9414\u93FE\u9415\u9410\u9428\u9419\u940D\u93F5\u9400\u93F7\u9407\u940E\u9416\u9412\u93FA\u9409\u93F8\u940A\u93FF\u93FC\u940C\u93F6\u9411\u9406\u95DE\u95E0\u95DF\u972E\u972F\u97B9\u97BB\u97FD\u97FE\u9860\u9862\u9863\u985F\u98C1\u98C2\u9950\u994E\u9959\u994C\u994B\u9953\u9A32\u9A34\u9A31\u9A2C\u9A2A\u9A36\u9A29\u9A2E\u9A38\u9A2D\u9AC7\u9ACA\u9AC6\u9B10\u9B12\u9B11\u9C0B\u9C08\u9BF7\u9C05\u9C12\u9BF8\u9C40\u9C07\u9C0E\u9C06\u9C17\u9C14\u9C09\u9D9F\u9D99\u9DA4\u9D9D\u9D92\u9D98\u9D90\u9D9B\u9DA0\u9D94\u9D9C\u9DAA\u9D97\u9DA1\u9D9A\u9DA2\u9DA8\u9D9E\u9DA3\u9DBF\u9DA9\u9D96\u9DA6\u9DA7\u9E99\u9E9B\u9E9A\u9EE5\u9EE4\u9EE7\u9EE6\u9F30\u9F2E\u9F5B\u9F60\u9F5E\u9F5D\u9F59\u9F91\u513A\u5139\u5298\u5297\u56C3\u56BD\u56BE\u5B48\u5B47\u5DCB\u5DCF\u5EF1\u61FD\u651B\u6B02\u6AFC\u6B03\u6AF8\u6B00\u7043\u7044\u704A\u7048\u7049\u7045\u7046\u721D\u721A\u7219\u737E\u7517\u766A\u77D0\u792D\u7931\u792F\u7C54\u7C53\u7CF2\u7E8A\u7E88\u7E8B\u7E86\u7E8D\u7F4D\u7FBB\u8030\u81DD\u8618\u862A\u8626\u861F\u8623\u861C\u8619\u8627\u862E\u8621\u8620\u8629\u861E\u8625\u8829\u881D\u881B\u8820\u8824\u881C\u882B\u884A\u896D\u8969\u896E\u896B\u89FA\u8B79\u8B78\u8B45\u8B7A\u8B7B\u8D10\u8D14\u8DAF\u8E8E\u8E8C\u8F5E\u8F5B\u8F5D\u9146\u9144\u9145\u91B9\u943F\u943B\u9436\u9429\u943D\u943C\u9430\u9439\u942A\u9437\u942C\u9440\u9431\u95E5\u95E4\u95E3\u9735\u973A\u97BF\u97E1\u9864\u98C9\u98C6\u98C0\u9958\u9956\u9A39\u9A3D\u9A46\u9A44\u9A42\u9A41\u9A3A\u9A3F\u9ACD\u9B15\u9B17\u9B18\u9B16\u9B3A\u9B52\u9C2B\u9C1D\u9C1C\u9C2C\u9C23\u9C28\u9C29\u9C24\u9C21\u9DB7\u9DB6\u9DBC\u9DC1\u9DC7\u9DCA\u9DCF\u9DBE\u9DC5\u9DC3\u9DBB\u9DB5\u9DCE\u9DB9\u9DBA\u9DAC\u9DC8\u9DB1\u9DAD\u9DCC\u9DB3\u9DCD\u9DB2\u9E7A\u9E9C\u9EEB\u9EEE\u9EED\u9F1B\u9F18\u9F1A\u9F31\u9F4E\u9F65\u9F64\u9F92\u4EB9\u56C6\u56C5\u56CB\u5971\u5B4B\u5B4C\u5DD5\u5DD1\u5EF2\u6521\u6520\u6526\u6522\u6B0B\u6B08\u6B09\u6C0D\u7055\u7056\u7057\u7052\u721E\u721F\u72A9\u737F\u74D8\u74D5\u74D9\u74D7\u766D\u76AD\u7935\u79B4\u7A70\u7A71\u7C57\u7C5C\u7C59\u7C5B\u7C5A\u7CF4\u7CF1\u7E91\u7F4F\u7F87\u81DE\u826B\u8634\u8635\u8633\u862C\u8632\u8636\u882C\u8828\u8826\u882A\u8825\u8971\u89BF\u89BE\u89FB\u8B7E\u8B84\u8B82\u8B86\u8B85\u8B7F\u8D15\u8E95\u8E94\u8E9A\u8E92\u8E90\u8E96\u8E97\u8F60\u8F62\u9147\u944C\u9450\u944A\u944B\u944F\u9447\u9445\u9448\u9449\u9446\u973F\u97E3\u986A\u9869\u98CB\u9954\u995B\u9A4E\u9A53\u9A54\u9A4C\u9A4F\u9A48\u9A4A\u9A49\u9A52\u9A50\u9AD0\u9B19\u9B2B\u9B3B\u9B56\u9B55\u9C46\u9C48\u9C3F\u9C44\u9C39\u9C33\u9C41\u9C3C\u9C37\u9C34\u9C32\u9C3D\u9C36\u9DDB\u9DD2\u9DDE\u9DDA\u9DCB\u9DD0\u9DDC\u9DD1\u9DDF\u9DE9\u9DD9\u9DD8\u9DD6\u9DF5\u9DD5\u9DDD\u9EB6\u9EF0\u9F35\u9F33\u9F32\u9F42\u9F6B\u9F95\u9FA2\u513D\u5299\u58E8\u58E7\u5972\u5B4D\u5DD8\u882F\u5F4F\u6201\u6203\u6204\u6529\u6525\u6596\u66EB\u6B11\u6B12\u6B0F\u6BCA\u705B\u705A\u7222\u7382\u7381\u7383\u7670\u77D4\u7C67\u7C66\u7E95\u826C\u863A\u8640\u8639\u863C\u8631\u863B\u863E\u8830\u8832\u882E\u8833\u8976\u8974\u8973\u89FE\u8B8C\u8B8E\u8B8B\u8B88\u8C45\u8D19\u8E98\u8F64\u8F63\u91BC\u9462\u9455\u945D\u9457\u945E\u97C4\u97C5\u9800\u9A56\u9A59\u9B1E\u9B1F\u9B20\u9C52\u9C58\u9C50\u9C4A\u9C4D\u9C4B\u9C55\u9C59\u9C4C\u9C4E\u9DFB\u9DF7\u9DEF\u9DE3\u9DEB\u9DF8\u9DE4\u9DF6\u9DE1\u9DEE\u9DE6\u9DF2\u9DE2\u9DEC\u9DF4\u9DF3\u9DE8\u9DED\u9EC2\u9ED0\u9EF2\u9EF3\u9F06\u9F1C\u9F38\u9F37\u9F36\u9F43\u9F4F\u9F71\u9F70\u9F6E\u9F6F\u56D3\u56CD\u5B4E\u5C6D\u652D\u66ED\u66EE\u6B13\u705F\u7061\u705D\u7060\u7223\u74DB\u74E5\u77D5\u7938\u79B7\u79B6\u7C6A\u7E97\u7F89\u826D\u8643\u8838\u8837\u8835\u884B\u8B94\u8B95\u8E9E\u8E9F\u8EA0\u8E9D\u91BE\u91BD\u91C2\u946B\u9468\u9469\u96E5\u9746\u9743\u9747\u97C7\u97E5\u9A5E\u9AD5\u9B59\u9C63\u9C67\u9C66\u9C62\u9C5E\u9C60\u9E02\u9DFE\u9E07\u9E03\u9E06\u9E05\u9E00\u9E01\u9E09\u9DFF\u9DFD\u9E04\u9EA0\u9F1E\u9F46\u9F74\u9F75\u9F76\u56D4\u652E\u65B8\u6B18\u6B19\u6B17\u6B1A\u7062\u7226\u72AA\u77D8\u77D9\u7939\u7C69\u7C6B\u7CF6\u7E9A\u7E98\u7E9B\u7E99\u81E0\u81E1\u8646\u8647\u8648\u8979\u897A\u897C\u897B\u89FF\u8B98\u8B99\u8EA5\u8EA4\u8EA3\u946E\u946D\u946F\u9471\u9473\u9749\u9872\u995F\u9C68\u9C6E\u9C6D\u9E0B\u9E0D\u9E10\u9E0F\u9E12\u9E11\u9EA1\u9EF5\u9F09\u9F47\u9F78\u9F7B\u9F7A\u9F79\u571E\u7066\u7C6F\u883C\u8DB2\u8EA6\u91C3\u9474\u9478\u9476\u9475\u9A60\u9C74\u9C73\u9C71\u9C75\u9E14\u9E13\u9EF6\u9F0A\u9FA4\u7068\u7065\u7CF7\u866A\u883E\u883D\u883F\u8B9E\u8C9C\u8EA9\u8EC9\u974B\u9873\u9874\u98CC\u9961\u99AB\u9A64\u9A66\u9A67\u9B24\u9E15\u9E17\u9F48\u6207\u6B1E\u7227\u864C\u8EA8\u9482\u9480\u9481\u9A69\u9A68\u9E19\u7229\u864B\u8B9F\u9483\u9C79\u9EB7\u7675\u9A6B\u9C7A\u9E1D\u7069\u706A\u9EA4\u9F7E\u9F49\u9F98\u255E\u256A\u2561\u2550\u256D\u256E\u2570\u256F\u5029\u507D\u5305\u5344\u537F\u5A77\u5E75\u5F58\u6490\u6674\u675E\u6C9C\u6E1D\u6E2F\u716E\u745C\u74E9\u7809";
+    // TextEncoder no longer supports non-UTF encodings
+    //arrayEqual(TextEncoder("big5").encode(string), bytes, "encoded");
+    equal(TextDecoder("big5").decode(new Uint8Array(bytes)), string, "decoded");
+  });
+
new file mode 100644
--- /dev/null
+++ b/dom/encoding/test/test-euc-jp.js
@@ -0,0 +1,10 @@
+test(
+  "euc-jp",
+  function () {
+    var bytes = [161,161,161,162,161,163,161,164,161,165,161,166,161,167,161,168,161,169,161,170,161,171,161,172,161,173,161,174,161,175,161,176,161,177,161,178,161,179,161,180,161,181,161,182,161,183,161,184,161,185,161,186,161,187,161,188,161,189,161,190,161,191,161,192,161,195,161,196,161,197,161,198,161,199,161,200,161,201,161,202,161,203,161,204,161,205,161,206,161,207,161,208,161,209,161,210,161,211,161,212,161,213,161,214,161,215,161,216,161,217,161,218,161,219,161,220,161,222,161,223,161,224,161,225,161,226,161,227,161,228,161,229,161,230,161,231,161,232,161,233,161,234,161,235,161,236,161,237,161,238,161,239,161,240,161,243,161,244,161,245,161,246,161,247,161,248,161,249,161,250,161,251,161,252,161,253,161,254,162,161,162,162,162,163,162,164,162,165,162,166,162,167,162,168,162,169,162,170,162,171,162,172,162,173,162,174,162,186,162,187,162,188,162,189,162,190,162,191,162,192,162,193,162,202,162,203,162,205,162,206,162,207,162,208,162,220,162,221,162,222,162,223,162,224,162,225,162,226,162,227,162,228,162,229,162,230,162,231,162,232,162,233,162,234,162,242,162,243,162,244,162,245,162,246,162,247,162,248,162,249,162,254,163,176,163,177,163,178,163,179,163,180,163,181,163,182,163,183,163,184,163,185,163,193,163,194,163,195,163,196,163,197,163,198,163,199,163,200,163,201,163,202,163,203,163,204,163,205,163,206,163,207,163,208,163,209,163,210,163,211,163,212,163,213,163,214,163,215,163,216,163,217,163,218,163,225,163,226,163,227,163,228,163,229,163,230,163,231,163,232,163,233,163,234,163,235,163,236,163,237,163,238,163,239,163,240,163,241,163,242,163,243,163,244,163,245,163,246,163,247,163,248,163,249,163,250,164,161,164,162,164,163,164,164,164,165,164,166,164,167,164,168,164,169,164,170,164,171,164,172,164,173,164,174,164,175,164,176,164,177,164,178,164,179,164,180,164,181,164,182,164,183,164,184,164,185,164,186,164,187,164,188,164,189,164,190,164,191,164,192,164,193,164,194,164,195,164,196,164,197,164,198,164,199,164,200,164,201,164,202,164,203,164,204,164,205,164,206,164,207,164,208,164,209,164,210,164,211,164,212,164,213,164,214,164,215,164,216,164,217,164,218,164,219,164,220,164,221,164,222,164,223,164,224,164,225,164,226,164,227,164,228,164,229,164,230,164,231,164,232,164,233,164,234,164,235,164,236,164,237,164,238,164,239,164,240,164,241,164,242,164,243,165,161,165,162,165,163,165,164,165,165,165,166,165,167,165,168,165,169,165,170,165,171,165,172,165,173,165,174,165,175,165,176,165,177,165,178,165,179,165,180,165,181,165,182,165,183,165,184,165,185,165,186,165,187,165,188,165,189,165,190,165,191,165,192,165,193,165,194,165,195,165,196,165,197,165,198,165,199,165,200,165,201,165,202,165,203,165,204,165,205,165,206,165,207,165,208,165,209,165,210,165,211,165,212,165,213,165,214,165,215,165,216,165,217,165,218,165,219,165,220,165,221,165,222,165,223,165,224,165,225,165,226,165,227,165,228,165,229,165,230,165,231,165,232,165,233,165,234,165,235,165,236,165,237,165,238,165,239,165,240,165,241,165,242,165,243,165,244,165,245,165,246,166,161,166,162,166,163,166,164,166,165,166,166,166,167,166,168,166,169,166,170,166,171,166,172,166,173,166,174,166,175,166,176,166,177,166,178,166,179,166,180,166,181,166,182,166,183,166,184,166,193,166,194,166,195,166,196,166,197,166,198,166,199,166,200,166,201,166,202,166,203,166,204,166,205,166,206,166,207,166,208,166,209,166,210,166,211,166,212,166,213,166,214,166,215,166,216,167,161,167,162,167,163,167,164,167,165,167,166,167,167,167,168,167,169,167,170,167,171,167,172,167,173,167,174,167,175,167,176,167,177,167,178,167,179,167,180,167,181,167,182,167,183,167,184,167,185,167,186,167,187,167,188,167,189,167,190,167,191,167,192,167,193,167,209,167,210,167,211,167,212,167,213,167,214,167,215,167,216,167,217,167,218,167,219,167,220,167,221,167,222,167,223,167,224,167,225,167,226,167,227,167,228,167,229,167,230,167,231,167,232,167,233,167,234,167,235,167,236,167,237,167,238,167,239,167,240,167,241,168,161,168,162,168,163,168,164,168,165,168,166,168,167,168,168,168,169,168,170,168,171,168,172,168,173,168,174,168,175,168,176,168,177,168,178,168,179,168,180,168,181,168,182,168,183,168,184,168,185,168,186,168,187,168,188,168,189,168,190,168,191,168,192,162,226,162,225,162,233,162,229,162,221,162,220,162,232,162,193,162,192,176,161,176,162,176,163,176,164,176,165,176,166,176,167,176,168,176,169,176,170,176,171,176,172,176,173,176,174,176,175,176,176,176,177,176,178,176,179,176,180,176,181,176,182,176,183,176,184,176,185,176,186,176,187,176,188,176,189,176,190,176,191,176,192,176,193,176,194,176,195,176,196,176,197,176,198,176,199,176,200,176,201,176,202,176,203,176,204,176,205,176,206,176,207,176,208,176,209,176,210,176,211,176,212,176,213,176,214,176,215,176,216,176,217,176,218,176,219,176,220,176,221,176,222,176,223,176,224,176,225,176,226,176,227,176,228,176,229,176,230,176,231,176,232,176,233,176,234,176,235,176,236,176,237,176,238,176,239,176,240,176,241,176,242,176,243,176,244,176,245,176,246,176,247,176,248,176,249,176,250,176,251,176,252,176,253,176,254,177,161,177,162,177,163,177,164,177,165,177,166,177,167,177,168,177,169,177,170,177,171,177,172,177,173,177,174,177,175,177,176,177,177,177,178,177,179,177,180,177,181,177,182,177,183,177,184,177,185,177,186,177,187,177,188,177,189,177,190,177,191,177,192,177,193,177,194,177,195,177,196,177,197,177,198,177,199,177,200,177,201,177,202,177,203,177,204,177,205,177,206,177,207,177,208,177,209,177,210,177,211,177,212,177,213,177,214,177,215,177,216,177,217,177,218,177,219,177,220,177,221,177,222,177,223,177,224,177,225,177,226,177,227,177,228,177,229,177,230,177,231,177,232,177,233,177,234,177,235,177,236,177,237,177,238,177,239,177,240,177,241,177,242,177,243,177,244,177,245,177,246,177,247,177,248,177,249,177,250,177,251,177,252,177,253,177,254,178,161,178,162,178,163,178,164,178,165,178,166,178,167,178,168,178,169,178,170,178,171,178,172,178,173,178,174,178,175,178,176,178,177,178,178,178,179,178,180,178,181,178,182,178,183,178,184,178,185,178,186,178,187,178,188,178,189,178,190,178,191,178,192,178,193,178,194,178,195,178,196,178,197,178,198,178,199,178,200,178,201,178,202,178,203,178,204,178,205,178,206,178,207,178,208,178,209,178,210,178,211,178,212,178,213,178,214,178,215,178,216,178,217,178,218,178,219,178,220,178,221,178,222,178,223,178,224,178,225,178,226,178,227,178,228,178,229,178,230,178,231,178,232,178,233,178,234,178,235,178,236,178,237,178,238,178,239,178,240,178,241,178,242,178,243,178,244,178,245,178,246,178,247,178,248,178,249,178,250,178,251,178,252,178,253,178,254,179,161,179,162,179,163,179,164,179,165,179,166,179,167,179,168,179,169,179,170,179,171,179,172,179,173,179,174,179,175,179,176,179,177,179,178,179,179,179,180,179,181,179,182,179,183,179,184,179,185,179,186,179,187,179,188,179,189,179,190,179,191,179,192,179,193,179,194,179,195,179,196,179,197,179,198,179,199,179,200,179,201,179,202,179,203,179,204,179,205,179,206,179,207,179,208,179,209,179,210,179,211,179,212,179,213,179,214,179,215,179,216,179,217,179,218,179,219,179,220,179,221,179,222,179,223,179,224,179,225,179,226,179,227,179,228,179,229,179,230,179,231,179,232,179,233,179,234,179,235,179,236,179,237,179,238,179,239,179,240,179,241,179,242,179,243,179,244,179,245,179,246,179,247,179,248,179,249,179,250,179,251,179,252,179,253,179,254,180,161,180,162,180,163,180,164,180,165,180,166,180,167,180,168,180,169,180,170,180,171,180,172,180,173,180,174,180,175,180,176,180,177,180,178,180,179,180,180,180,181,180,182,180,183,180,184,180,185,180,186,180,187,180,188,180,189,180,190,180,191,180,192,180,193,180,194,180,195,180,196,180,197,180,198,180,199,180,200,180,201,180,202,180,203,180,204,180,205,180,206,180,207,180,208,180,209,180,210,180,211,180,212,180,213,180,214,180,215,180,216,180,217,180,218,180,219,180,220,180,221,180,222,180,223,180,224,180,225,180,226,180,227,180,228,180,229,180,230,180,231,180,232,180,233,180,234,180,235,180,236,180,237,180,238,180,239,180,240,180,241,180,242,180,243,180,244,180,245,180,246,180,247,180,248,180,249,180,250,180,251,180,252,180,253,180,254,181,161,181,162,181,163,181,164,181,165,181,166,181,167,181,168,181,169,181,170,181,171,181,172,181,173,181,174,181,175,181,176,181,177,181,178,181,179,181,180,181,181,181,182,181,183,181,184,181,185,181,186,181,187,181,188,181,189,181,190,181,191,181,192,181,193,181,194,181,195,181,196,181,197,181,198,181,199,181,200,181,201,181,202,181,203,181,204,181,205,181,206,181,207,181,208,181,209,181,210,181,211,181,212,181,213,181,214,181,215,181,216,181,217,181,218,181,219,181,220,181,221,181,222,181,223,181,224,181,225,181,226,181,227,181,228,181,229,181,230,181,231,181,232,181,233,181,234,181,235,181,236,181,237,181,238,181,239,181,240,181,241,181,242,181,243,181,244,181,245,181,246,181,247,181,248,181,249,181,250,181,251,181,252,181,253,181,254,182,161,182,162,182,163,182,164,182,165,182,166,182,167,182,168,182,169,182,170,182,171,182,172,182,173,182,174,182,175,182,176,182,177,182,178,182,179,182,180,182,181,182,182,182,183,182,184,182,185,182,186,182,187,182,188,182,189,182,190,182,191,182,192,182,193,182,194,182,195,182,196,182,197,182,198,182,199,182,200,182,201,182,202,182,203,182,204,182,205,182,206,182,207,182,208,182,209,182,210,182,211,182,212,182,213,182,214,182,215,182,216,182,217,182,218,182,219,182,220,182,221,182,222,182,223,182,224,182,225,182,226,182,227,182,228,182,229,182,230,182,231,182,232,182,233,182,234,182,235,182,236,182,237,182,238,182,239,182,240,182,241,182,242,182,243,182,244,182,245,182,246,182,247,182,248,182,249,182,250,182,251,182,252,182,253,182,254,183,161,183,162,183,163,183,164,183,165,183,166,183,167,183,168,183,169,183,170,183,171,183,172,183,173,183,174,183,175,183,176,183,177,183,178,183,179,183,180,183,181,183,182,183,183,183,184,183,185,183,186,183,187,183,188,183,189,183,190,183,191,183,192,183,193,183,194,183,195,183,196,183,197,183,198,183,199,183,200,183,201,183,202,183,203,183,204,183,205,183,206,183,207,183,208,183,209,183,210,183,211,183,212,183,213,183,214,183,215,183,216,183,217,183,218,183,219,183,220,183,221,183,222,183,223,183,224,183,225,183,226,183,227,183,228,183,229,183,230,183,231,183,232,183,233,183,234,183,235,183,236,183,237,183,238,183,239,183,240,183,241,183,242,183,243,183,244,183,245,183,246,183,247,183,248,183,249,183,250,183,251,183,252,183,253,183,254,184,161,184,162,184,163,184,164,184,165,184,166,184,167,184,168,184,169,184,170,184,171,184,172,184,173,184,174,184,175,184,176,184,177,184,178,184,179,184,180,184,181,184,182,184,183,184,184,184,185,184,186,184,187,184,188,184,189,184,190,184,191,184,192,184,193,184,194,184,195,184,196,184,197,184,198,184,199,184,200,184,201,184,202,184,203,184,204,184,205,184,206,184,207,184,208,184,209,184,210,184,211,184,212,184,213,184,214,184,215,184,216,184,217,184,218,184,219,184,220,184,221,184,222,184,223,184,224,184,225,184,226,184,227,184,228,184,229,184,230,184,231,184,232,184,233,184,234,184,235,184,236,184,237,184,238,184,239,184,240,184,241,184,242,184,243,184,244,184,245,184,246,184,247,184,248,184,249,184,250,184,251,184,252,184,253,184,254,185,161,185,162,185,163,185,164,185,165,185,166,185,167,185,168,185,169,185,170,185,171,185,172,185,173,185,174,185,175,185,176,185,177,185,178,185,179,185,180,185,181,185,182,185,183,185,184,185,185,185,186,185,187,185,188,185,189,185,190,185,191,185,192,185,193,185,194,185,195,185,196,185,197,185,198,185,199,185,200,185,201,185,202,185,203,185,204,185,205,185,206,185,207,185,208,185,209,185,210,185,211,185,212,185,213,185,214,185,215,185,216,185,217,185,218,185,219,185,220,185,221,185,222,185,223,185,224,185,225,185,226,185,227,185,228,185,229,185,230,185,231,185,232,185,233,185,234,185,235,185,236,185,237,185,238,185,239,185,240,185,241,185,242,185,243,185,244,185,245,185,246,185,247,185,248,185,249,185,250,185,251,185,252,185,253,185,254,186,161,186,162,186,163,186,164,186,165,186,166,186,167,186,168,186,169,186,170,186,171,186,172,186,173,186,174,186,175,186,176,186,177,186,178,186,179,186,180,186,181,186,182,186,183,186,184,186,185,186,186,186,187,186,188,186,189,186,190,186,191,186,192,186,193,186,194,186,195,186,196,186,197,186,198,186,199,186,200,186,201,186,202,186,203,186,204,186,205,186,206,186,207,186,208,186,209,186,210,186,211,186,212,186,213,186,214,186,215,186,216,186,217,186,218,186,219,186,220,186,221,186,222,186,223,186,224,186,225,186,226,186,227,186,228,186,229,186,230,186,231,186,232,186,233,186,234,186,235,186,236,186,237,186,238,186,239,186,240,186,241,186,242,186,243,186,244,186,245,186,246,186,247,186,248,186,249,186,250,186,251,186,252,186,253,186,254,187,161,187,162,187,163,187,164,187,165,187,166,187,167,187,168,187,169,187,170,187,171,187,172,187,173,187,174,187,175,187,176,187,177,187,178,187,179,187,180,187,181,187,182,187,183,187,184,187,185,187,186,187,187,187,188,187,189,187,190,187,191,187,192,187,193,187,194,187,195,187,196,187,197,187,198,187,199,187,200,187,201,187,202,187,203,187,204,187,205,187,206,187,207,187,208,187,209,187,210,187,211,187,212,187,213,187,214,187,215,187,216,187,217,187,218,187,219,187,220,187,221,187,222,187,223,187,224,187,225,187,226,187,227,187,228,187,229,187,230,187,231,187,232,187,233,187,234,187,235,187,236,187,237,187,238,187,239,187,240,187,241,187,242,187,243,187,244,187,245,187,246,187,247,187,248,187,249,187,250,187,251,187,252,187,253,187,254,188,161,188,162,188,163,188,164,188,165,188,166,188,167,188,168,188,169,188,170,188,171,188,172,188,173,188,174,188,175,188,176,188,177,188,178,188,179,188,180,188,181,188,182,188,183,188,184,188,185,188,186,188,187,188,188,188,189,188,190,188,191,188,192,188,193,188,194,188,195,188,196,188,197,188,198,188,199,188,200,188,201,188,202,188,203,188,204,188,205,188,206,188,207,188,208,188,209,188,210,188,211,188,212,188,213,188,214,188,215,188,216,188,217,188,218,188,219,188,220,188,221,188,222,188,223,188,224,188,225,188,226,188,227,188,228,188,229,188,230,188,231,188,232,188,233,188,234,188,235,188,236,188,237,188,238,188,239,188,240,188,241,188,242,188,243,188,244,188,245,188,246,188,247,188,248,188,249,188,250,188,251,188,252,188,253,188,254,189,161,189,162,189,163,189,164,189,165,189,166,189,167,189,168,189,169,189,170,189,171,189,172,189,173,189,174,189,175,189,176,189,177,189,178,189,179,189,180,189,181,189,182,189,183,189,184,189,185,189,186,189,187,189,188,189,189,189,190,189,191,189,192,189,193,189,194,189,195,189,196,189,197,189,198,189,199,189,200,189,201,189,202,189,203,189,204,189,205,189,206,189,207,189,208,189,209,189,210,189,211,189,212,189,213,189,214,189,215,189,216,189,217,189,218,189,219,189,220,189,221,189,222,189,223,189,224,189,225,189,226,189,227,189,228,189,229,189,230,189,231,189,232,189,233,189,234,189,235,189,236,189,237,189,238,189,239,189,240,189,241,189,242,189,243,189,244,189,245,189,246,189,247,189,248,189,249,189,250,189,251,189,252,189,253,189,254,190,161,190,162,190,163,190,164,190,165,190,166,190,167,190,168,190,169,190,170,190,171,190,172,190,173,190,174,190,175,190,176,190,177,190,178,190,179,190,180,190,181,190,182,190,183,190,184,190,185,190,186,190,187,190,188,190,189,190,190,190,191,190,192,190,193,190,194,190,195,190,196,190,197,190,198,190,199,190,200,190,201,190,202,190,203,190,204,190,205,190,206,190,207,190,208,190,209,190,210,190,211,190,212,190,213,190,214,190,215,190,216,190,217,190,218,190,219,190,220,190,221,190,222,190,223,190,224,190,225,190,226,190,227,190,228,190,229,190,230,190,231,190,232,190,233,190,234,190,235,190,236,190,237,190,238,190,239,190,240,190,241,190,242,190,243,190,244,190,245,190,246,190,247,190,248,190,249,190,250,190,251,190,252,190,253,190,254,191,161,191,162,191,163,191,164,191,165,191,166,191,167,191,168,191,169,191,170,191,171,191,172,191,173,191,174,191,175,191,176,191,177,191,178,191,179,191,180,191,181,191,182,191,183,191,184,191,185,191,186,191,187,191,188,191,189,191,190,191,191,191,192,191,193,191,194,191,195,191,196,191,197,191,198,191,199,191,200,191,201,191,202,191,203,191,204,191,205,191,206,191,207,191,208,191,209,191,210,191,211,191,212,191,213,191,214,191,215,191,216,191,217,191,218,191,219,191,220,191,221,191,222,191,223,191,224,191,225,191,226,191,227,191,228,191,229,191,230,191,231,191,232,191,233,191,234,191,235,191,236,191,237,191,238,191,239,191,240,191,241,191,242,191,243,191,244,191,245,191,246,191,247,191,248,191,249,191,250,191,251,191,252,191,253,191,254,192,161,192,162,192,163,192,164,192,165,192,166,192,167,192,168,192,169,192,170,192,171,192,172,192,173,192,174,192,175,192,176,192,177,192,178,192,179,192,180,192,181,192,182,192,183,192,184,192,185,192,186,192,187,192,188,192,189,192,190,192,191,192,192,192,193,192,194,192,195,192,196,192,197,192,198,192,199,192,200,192,201,192,202,192,203,192,204,192,205,192,206,192,207,192,208,192,209,192,210,192,211,192,212,192,213,192,214,192,215,192,216,192,217,192,218,192,219,192,220,192,221,192,222,192,223,192,224,192,225,192,226,192,227,192,228,192,229,192,230,192,231,192,232,192,233,192,234,192,235,192,236,192,237,192,238,192,239,192,240,192,241,192,242,192,243,192,244,192,245,192,246,192,247,192,248,192,249,192,250,192,251,192,252,192,253,192,254,193,161,193,162,193,163,193,164,193,165,193,166,193,167,193,168,193,169,193,170,193,171,193,172,193,173,193,174,193,175,193,176,193,177,193,178,193,179,193,180,193,181,193,182,193,183,193,184,193,185,193,186,193,187,193,188,193,189,193,190,193,191,193,192,193,193,193,194,193,195,193,196,193,197,193,198,193,199,193,200,193,201,193,202,193,203,193,204,193,205,193,206,193,207,193,208,193,209,193,210,193,211,193,212,193,213,193,214,193,215,193,216,193,217,193,218,193,219,193,220,193,221,193,222,193,223,193,224,193,225,193,226,193,227,193,228,193,229,193,230,193,231,193,232,193,233,193,234,193,235,193,236,193,237,193,238,193,239,193,240,193,241,193,242,193,243,193,244,193,245,193,246,193,247,193,248,193,249,193,250,193,251,193,252,193,253,193,254,194,161,194,162,194,163,194,164,194,165,194,166,194,167,194,168,194,169,194,170,194,171,194,172,194,173,194,174,194,175,194,176,194,177,194,178,194,179,194,180,194,181,194,182,194,183,194,184,194,185,194,186,194,187,194,188,194,189,194,190,194,191,194,192,194,193,194,194,194,195,194,196,194,197,194,198,194,199,194,200,194,201,194,202,194,203,194,204,194,205,194,206,194,207,194,208,194,209,194,210,194,211,194,212,194,213,194,214,194,215,194,216,194,217,194,218,194,219,194,220,194,221,194,222,194,223,194,224,194,225,194,226,194,227,194,228,194,229,194,230,194,231,194,232,194,233,194,234,194,235,194,236,194,237,194,238,194,239,194,240,194,241,194,242,194,243,194,244,194,245,194,246,194,247,194,248,194,249,194,250,194,251,194,252,194,253,194,254,195,161,195,162,195,163,195,164,195,165,195,166,195,167,195,168,195,169,195,170,195,171,195,172,195,173,195,174,195,175,195,176,195,177,195,178,195,179,195,180,195,181,195,182,195,183,195,184,195,185,195,186,195,187,195,188,195,189,195,190,195,191,195,192,195,193,195,194,195,195,195,196,195,197,195,198,195,199,195,200,195,201,195,202,195,203,195,204,195,205,195,206,195,207,195,208,195,209,195,210,195,211,195,212,195,213,195,214,195,215,195,216,195,217,195,218,195,219,195,220,195,221,195,222,195,223,195,224,195,225,195,226,195,227,195,228,195,229,195,230,195,231,195,232,195,233,195,234,195,235,195,236,195,237,195,238,195,239,195,240,195,241,195,242,195,243,195,244,195,245,195,246,195,247,195,248,195,249,195,250,195,251,195,252,195,253,195,254,196,161,196,162,196,163,196,164,196,165,196,166,196,167,196,168,196,169,196,170,196,171,196,172,196,173,196,174,196,175,196,176,196,177,196,178,196,179,196,180,196,181,196,182,196,183,196,184,196,185,196,186,196,187,196,188,196,189,196,190,196,191,196,192,196,193,196,194,196,195,196,196,196,197,196,198,196,199,196,200,196,201,196,202,196,203,196,204,196,205,196,206,196,207,196,208,196,209,196,210,196,211,196,212,196,213,196,214,196,215,196,216,196,217,196,218,196,219,196,220,196,221,196,222,196,223,196,224,196,225,196,226,196,227,196,228,196,229,196,230,196,231,196,232,196,233,196,234,196,235,196,236,196,237,196,238,196,239,196,240,196,241,196,242,196,243,196,244,196,245,196,246,196,247,196,248,196,249,196,250,196,251,196,252,196,253,196,254,197,161,197,162,197,163,197,164,197,165,197,166,197,167,197,168,197,169,197,170,197,171,197,172,197,173,197,174,197,175,197,176,197,177,197,178,197,179,197,180,197,181,197,182,197,183,197,184,197,185,197,186,197,187,197,188,197,189,197,190,197,191,197,192,197,193,197,194,197,195,197,196,197,197,197,198,197,199,197,200,197,201,197,202,197,203,197,204,197,205,197,206,197,207,197,208,197,209,197,210,197,211,197,212,197,213,197,214,197,215,197,216,197,217,197,218,197,219,197,220,197,221,197,222,197,223,197,224,197,225,197,226,197,227,197,228,197,229,197,230,197,231,197,232,197,233,197,234,197,235,197,236,197,237,197,238,197,239,197,240,197,241,197,242,197,243,197,244,197,245,197,246,197,247,197,248,197,249,197,250,197,251,197,252,197,253,197,254,198,161,198,162,198,163,198,164,198,165,198,166,198,167,198,168,198,169,198,170,198,171,198,172,198,173,198,174,198,175,198,176,198,177,198,178,198,179,198,180,198,181,198,182,198,183,198,184,198,185,198,186,198,187,198,188,198,189,198,190,198,191,198,192,198,193,198,194,198,195,198,196,198,197,198,198,198,199,198,200,198,201,198,202,198,203,198,204,198,205,198,206,198,207,198,208,198,209,198,210,198,211,198,212,198,213,198,214,198,215,198,216,198,217,198,218,198,219,198,220,198,221,198,222,198,223,198,224,198,225,198,226,198,227,198,228,198,229,198,230,198,231,198,232,198,233,198,234,198,235,198,236,198,237,198,238,198,239,198,240,198,241,198,242,198,243,198,244,198,245,198,246,198,247,198,248,198,249,198,250,198,251,198,252,198,253,198,254,199,161,199,162,199,163,199,164,199,165,199,166,199,167,199,168,199,169,199,170,199,171,199,172,199,173,199,174,199,175,199,176,199,177,199,178,199,179,199,180,199,181,199,182,199,183,199,184,199,185,199,186,199,187,199,188,199,189,199,190,199,191,199,192,199,193,199,194,199,195,199,196,199,197,199,198,199,199,199,200,199,201,199,202,199,203,199,204,199,205,199,206,199,207,199,208,199,209,199,210,199,211,199,212,199,213,199,214,199,215,199,216,199,217,199,218,199,219,199,220,199,221,199,222,199,223,199,224,199,225,199,226,199,227,199,228,199,229,199,230,199,231,199,232,199,233,199,234,199,235,199,236,199,237,199,238,199,239,199,240,199,241,199,242,199,243,199,244,199,245,199,246,199,247,199,248,199,249,199,250,199,251,199,252,199,253,199,254,200,161,200,162,200,163,200,164,200,165,200,166,200,167,200,168,200,169,200,170,200,171,200,172,200,173,200,174,200,175,200,176,200,177,200,178,200,179,200,180,200,181,200,182,200,183,200,184,200,185,200,186,200,187,200,188,200,189,200,190,200,191,200,192,200,193,200,194,200,195,200,196,200,197,200,198,200,199,200,200,200,201,200,202,200,203,200,204,200,205,200,206,200,207,200,208,200,209,200,210,200,211,200,212,200,213,200,214,200,215,200,216,200,217,200,218,200,219,200,220,200,221,200,222,200,223,200,224,200,225,200,226,200,227,200,228,200,229,200,230,200,231,200,232,200,233,200,234,200,235,200,236,200,237,200,238,200,239,200,240,200,241,200,242,200,243,200,244,200,245,200,246,200,247,200,248,200,249,200,250,200,251,200,252,200,253,200,254,201,161,201,162,201,163,201,164,201,165,201,166,201,167,201,168,201,169,201,170,201,171,201,172,201,173,201,174,201,175,201,176,201,177,201,178,201,179,201,180,201,181,201,182,201,183,201,184,201,185,201,186,201,187,201,188,201,189,201,190,201,191,201,192,201,193,201,194,201,195,201,196,201,197,201,198,201,199,201,200,201,201,201,202,201,203,201,204,201,205,201,206,201,207,201,208,201,209,201,210,201,211,201,212,201,213,201,214,201,215,201,216,201,217,201,218,201,219,201,220,201,221,201,222,201,223,201,224,201,225,201,226,201,227,201,228,201,229,201,230,201,231,201,232,201,233,201,234,201,235,201,236,201,237,201,238,201,239,201,240,201,241,201,242,201,243,201,244,201,245,201,246,201,247,201,248,201,249,201,250,201,251,201,252,201,253,201,254,202,161,202,162,202,163,202,164,202,165,202,166,202,167,202,168,202,169,202,170,202,171,202,172,202,173,202,174,202,175,202,176,202,177,202,178,202,179,202,180,202,181,202,182,202,183,202,184,202,185,202,186,202,187,202,188,202,189,202,190,202,191,202,192,202,193,202,194,202,195,202,196,202,197,202,198,202,199,202,200,202,201,202,202,202,203,202,204,202,205,202,206,202,207,202,208,202,209,202,210,202,211,202,212,202,213,202,214,202,215,202,216,202,217,202,218,202,219,202,220,202,221,202,222,202,223,202,224,202,225,202,226,202,227,202,228,202,229,202,230,202,231,202,232,202,233,202,234,202,235,202,236,202,237,202,238,202,239,202,240,202,241,202,242,202,243,202,244,202,245,202,246,202,247,202,248,202,249,202,250,202,251,202,252,202,253,202,254,203,161,203,162,203,163,203,164,203,165,203,166,203,167,203,168,203,169,203,170,203,171,203,172,203,173,203,174,203,175,203,176,203,177,203,178,203,179,203,180,203,181,203,182,203,183,203,184,203,185,203,186,203,187,203,188,203,189,203,190,203,191,203,192,203,193,203,194,203,195,203,196,203,197,203,198,203,199,203,200,203,201,203,202,203,203,203,204,203,205,203,206,203,207,203,208,203,209,203,210,203,211,203,212,203,213,203,214,203,215,203,216,203,217,203,218,203,219,203,220,203,221,203,222,203,223,203,224,203,225,203,226,203,227,203,228,203,229,203,230,203,231,203,232,203,233,203,234,203,235,203,236,203,237,203,238,203,239,203,240,203,241,203,242,203,243,203,244,203,245,203,246,203,247,203,248,203,249,203,250,203,251,203,252,203,253,203,254,204,161,204,162,204,163,204,164,204,165,204,166,204,167,204,168,204,169,204,170,204,171,204,172,204,173,204,174,204,175,204,176,204,177,204,178,204,179,204,180,204,181,204,182,204,183,204,184,204,185,204,186,204,187,204,188,204,189,204,190,204,191,204,192,204,193,204,194,204,195,204,196,204,197,204,198,204,199,204,200,204,201,204,202,204,203,204,204,204,205,204,206,204,207,204,208,204,209,204,210,204,211,204,212,204,213,204,214,204,215,204,216,204,217,204,218,204,219,204,220,204,221,204,222,204,223,204,224,204,225,204,226,204,227,204,228,204,229,204,230,204,231,204,232,204,233,204,234,204,235,204,236,204,237,204,238,204,239,204,240,204,241,204,242,204,243,204,244,204,245,204,246,204,247,204,248,204,249,204,250,204,251,204,252,204,253,204,254,205,161,205,162,205,163,205,164,205,165,205,166,205,167,205,168,205,169,205,170,205,171,205,172,205,173,205,174,205,175,205,176,205,177,205,178,205,179,205,180,205,181,205,182,205,183,205,184,205,185,205,186,205,187,205,188,205,189,205,190,205,191,205,192,205,193,205,194,205,195,205,196,205,197,205,198,205,199,205,200,205,201,205,202,205,203,205,204,205,205,205,206,205,207,205,208,205,209,205,210,205,211,205,212,205,213,205,214,205,215,205,216,205,217,205,218,205,219,205,220,205,221,205,222,205,223,205,224,205,225,205,226,205,227,205,228,205,229,205,230,205,231,205,232,205,233,205,234,205,235,205,236,205,237,205,238,205,239,205,240,205,241,205,242,205,243,205,244,205,245,205,246,205,247,205,248,205,249,205,250,205,251,205,252,205,253,205,254,206,161,206,162,206,163,206,164,206,165,206,166,206,167,206,168,206,169,206,170,206,171,206,172,206,173,206,174,206,175,206,176,206,177,206,178,206,179,206,180,206,181,206,182,206,183,206,184,206,185,206,186,206,187,206,188,206,189,206,190,206,191,206,192,206,193,206,194,206,195,206,196,206,197,206,198,206,199,206,200,206,201,206,202,206,203,206,204,206,205,206,206,206,207,206,208,206,209,206,210,206,211,206,212,206,213,206,214,206,215,206,216,206,217,206,218,206,219,206,220,206,221,206,222,206,223,206,224,206,225,206,226,206,227,206,228,206,229,206,230,206,231,206,232,206,233,206,234,206,235,206,236,206,237,206,238,206,239,206,240,206,241,206,242,206,243,206,244,206,245,206,246,206,247,206,248,206,249,206,250,206,251,206,252,206,253,206,254,207,161,207,162,207,163,207,164,207,165,207,166,207,167,207,168,207,169,207,170,207,171,207,172,207,173,207,174,207,175,207,176,207,177,207,178,207,179,207,180,207,181,207,182,207,183,207,184,207,185,207,186,207,187,207,188,207,189,207,190,207,191,207,192,207,193,207,194,207,195,207,196,207,197,207,198,207,199,207,200,207,201,207,202,207,203,207,204,207,205,207,206,207,207,207,208,207,209,207,210,207,211,208,161,208,162,208,163,208,164,208,165,208,166,208,167,208,168,208,169,208,170,208,171,208,172,208,173,208,174,208,175,208,176,208,177,208,178,208,179,208,180,208,181,208,182,208,183,208,184,208,185,208,186,208,187,208,188,208,189,208,190,208,191,208,192,208,193,208,194,208,195,208,196,208,197,208,198,208,199,208,200,208,201,208,202,208,203,208,204,208,205,208,206,208,207,208,208,208,209,208,210,208,211,208,212,208,213,208,214,208,215,208,216,208,217,208,218,208,219,208,220,208,221,208,222,208,223,208,224,208,225,208,226,208,227,208,228,208,229,208,230,208,231,208,232,208,233,208,234,208,235,208,236,208,237,208,238,208,239,208,240,208,241,208,242,208,243,208,244,208,245,208,246,208,247,208,248,208,249,208,250,208,251,208,252,208,253,208,254,209,161,209,162,209,163,209,164,209,165,209,166,209,167,209,168,209,169,209,170,209,171,209,172,209,173,209,174,209,175,209,176,209,177,209,178,209,179,209,180,209,181,209,182,209,183,209,184,209,185,209,186,209,187,209,188,209,189,209,190,209,191,209,192,209,193,209,194,209,195,209,196,209,197,209,198,209,199,209,200,209,201,209,202,209,203,209,204,209,205,209,206,209,207,209,208,209,209,209,210,209,211,209,212,209,213,209,214,209,215,209,216,209,217,209,218,209,219,209,220,209,221,209,222,209,223,209,224,209,225,209,226,209,227,209,228,209,229,209,230,209,231,209,232,209,233,209,234,209,235,209,236,209,237,209,238,209,239,209,240,209,241,209,242,209,243,209,244,209,245,209,246,209,247,209,248,209,249,209,250,209,251,209,252,209,253,209,254,210,161,210,162,210,163,210,164,210,165,210,166,210,167,210,168,210,169,210,170,210,171,210,172,210,173,210,174,210,175,210,176,210,177,210,178,210,179,210,180,210,181,210,182,210,183,210,184,210,185,210,186,210,187,210,188,210,189,210,190,210,191,210,192,210,193,210,194,210,195,210,196,210,197,210,198,210,199,210,200,210,201,210,202,210,203,210,204,210,205,210,206,210,207,210,208,210,209,210,210,210,211,210,212,210,213,210,214,210,215,210,216,210,217,210,218,210,219,210,220,210,221,210,222,210,223,210,224,210,225,210,226,210,227,210,228,210,229,210,230,210,231,210,232,210,233,210,234,210,235,210,236,210,237,210,238,210,239,210,240,210,241,210,242,210,243,210,244,210,245,210,246,210,247,210,248,210,249,210,250,210,251,210,252,210,253,210,254,211,161,211,162,211,163,211,164,211,165,211,166,211,167,211,168,211,169,211,170,211,171,211,172,211,173,211,174,211,175,211,176,211,177,211,178,211,179,211,180,211,181,211,182,211,183,211,184,211,185,211,186,211,187,211,188,211,189,211,190,211,191,211,192,211,193,211,194,211,195,211,196,211,197,211,198,211,199,211,200,211,201,211,202,211,203,211,204,211,205,211,206,211,207,211,208,211,209,211,210,211,211,211,212,211,213,211,214,211,215,211,216,211,217,211,218,211,219,211,220,211,221,211,222,211,223,211,224,211,225,211,226,211,227,211,228,211,229,211,230,211,231,211,232,211,233,211,234,211,235,211,236,211,237,211,238,211,239,211,240,211,241,211,242,211,243,211,244,211,245,211,246,211,247,211,248,211,249,211,250,211,251,211,252,211,253,211,254,212,161,212,162,212,163,212,164,212,165,212,166,212,167,212,168,212,169,212,170,212,171,212,172,212,173,212,174,212,175,212,176,212,177,212,178,212,179,212,180,212,181,212,182,212,183,212,184,212,185,212,186,212,187,212,188,212,189,212,190,212,191,212,192,212,193,212,194,212,195,212,196,212,197,212,198,212,199,212,200,212,201,212,202,212,203,212,204,212,205,212,206,212,207,212,208,212,209,212,210,212,211,212,212,212,213,212,214,212,215,212,216,212,217,212,218,212,219,212,220,212,221,212,222,212,223,212,224,212,225,212,226,212,227,212,228,212,229,212,230,212,231,212,232,212,233,212,234,212,235,212,236,212,237,212,238,212,239,212,240,212,241,212,242,212,243,212,244,212,245,212,246,212,247,212,248,212,249,212,250,212,251,212,252,212,253,212,254,213,161,213,162,213,163,213,164,213,165,213,166,213,167,213,168,213,169,213,170,213,171,213,172,213,173,213,174,213,175,213,176,213,177,213,178,213,179,213,180,213,181,213,182,213,183,213,184,213,185,213,186,213,187,213,188,213,189,213,190,213,191,213,192,213,193,213,194,213,195,213,196,213,197,213,198,213,199,213,200,213,201,213,202,213,203,213,204,213,205,213,206,213,207,213,208,213,209,213,210,213,211,213,212,213,213,213,214,213,215,213,216,213,217,213,218,213,219,213,220,213,221,213,222,213,223,213,224,213,225,213,226,213,227,213,228,213,229,213,230,213,231,213,232,213,233,213,234,213,235,213,236,213,237,213,238,213,239,213,240,213,241,213,242,213,243,213,244,213,245,213,246,213,247,213,248,213,249,213,250,213,251,213,252,213,253,213,254,214,161,214,162,214,163,214,164,214,165,214,166,214,167,214,168,214,169,214,170,214,171,214,172,214,173,214,174,214,175,214,176,214,177,214,178,214,179,214,180,214,181,214,182,214,183,214,184,214,185,214,186,214,187,214,188,214,189,214,190,214,191,214,192,214,193,214,194,214,195,214,196,214,197,214,198,214,199,214,200,214,201,214,202,214,203,214,204,214,205,214,206,214,207,214,208,214,209,214,210,214,211,214,212,214,213,214,214,214,215,214,216,214,217,214,218,214,219,214,220,214,221,214,222,214,223,214,224,214,225,214,226,214,227,214,228,214,229,214,230,214,231,214,232,214,233,214,234,214,235,214,236,214,237,214,238,214,239,214,240,214,241,214,242,214,243,214,244,214,245,214,246,214,247,214,248,214,249,214,250,214,251,214,252,214,253,214,254,215,161,215,162,215,163,215,164,215,165,215,166,215,167,215,168,215,169,215,170,215,171,215,172,215,173,215,174,215,175,215,176,215,177,215,178,215,179,215,180,215,181,215,182,215,183,215,184,215,185,215,186,215,187,215,188,215,189,215,190,215,191,215,192,215,193,215,194,215,195,215,196,215,197,215,198,215,199,215,200,215,201,215,202,215,203,215,204,215,205,215,206,215,207,215,208,215,209,215,210,215,211,215,212,215,213,215,214,215,215,215,216,215,217,215,218,215,219,215,220,215,221,215,222,215,223,215,224,215,225,215,226,215,227,215,228,215,229,215,230,215,231,215,232,215,233,215,234,215,235,215,236,215,237,215,238,215,239,215,240,215,241,215,242,215,243,215,244,215,245,215,246,215,247,215,248,215,249,215,250,215,251,215,252,215,253,215,254,216,161,216,162,216,163,216,164,216,165,216,166,216,167,216,168,216,169,216,170,216,171,216,172,216,173,216,174,216,175,216,176,216,177,216,178,216,179,216,180,216,181,216,182,216,183,216,184,216,185,216,186,216,187,216,188,216,189,216,190,216,191,216,192,216,193,216,194,216,195,216,196,216,197,216,198,216,199,216,200,216,201,216,202,216,203,216,204,216,205,216,206,216,207,216,208,216,209,216,210,216,211,216,212,216,213,216,214,216,215,216,216,216,217,216,218,216,219,216,220,216,221,216,222,216,223,216,224,216,225,216,226,216,227,216,228,216,229,216,230,216,231,216,232,216,233,216,234,216,235,216,236,216,237,216,238,216,239,216,240,216,241,216,242,216,243,216,244,216,245,216,246,216,247,216,248,216,249,216,250,216,251,216,252,216,253,216,254,217,161,217,162,217,163,217,164,217,165,217,166,217,167,217,168,217,169,217,170,217,171,217,172,217,173,217,174,217,175,217,176,217,177,217,178,217,179,217,180,217,181,217,182,217,183,217,184,217,185,217,186,217,187,217,188,217,189,217,190,217,191,217,192,217,193,217,194,217,195,217,196,217,197,217,198,217,199,217,200,217,201,217,202,217,203,217,204,217,205,217,206,217,207,217,208,217,209,217,210,217,211,217,212,217,213,217,214,217,215,217,216,217,217,217,218,217,219,217,220,217,221,217,222,217,223,217,224,217,225,217,226,217,227,217,228,217,229,217,230,217,231,217,232,217,233,217,234,217,235,217,236,217,237,217,238,217,239,217,240,217,241,217,242,217,243,217,244,217,245,217,246,217,247,217,248,217,249,217,250,217,251,217,252,217,253,217,254,218,161,218,162,218,163,218,164,218,165,218,166,218,167,218,168,218,169,218,170,218,171,218,172,218,173,218,174,218,175,218,176,218,177,218,178,218,179,218,180,218,181,218,182,218,183,218,184,218,185,218,186,218,187,218,188,218,189,218,190,218,191,218,192,218,193,218,194,218,195,218,196,218,197,218,198,218,199,218,200,218,201,218,202,218,203,218,204,218,205,218,206,218,207,218,208,218,209,218,210,218,211,218,212,218,213,218,214,218,215,218,216,218,217,218,218,218,219,218,220,218,221,218,222,218,223,218,224,218,225,218,226,218,227,218,228,218,229,218,230,218,231,218,232,218,233,218,234,218,235,218,236,218,237,218,238,218,239,218,240,218,241,218,242,218,243,218,244,218,245,218,246,218,247,218,248,218,249,218,250,218,251,218,252,218,253,218,254,219,161,219,162,219,163,219,164,219,165,219,166,219,167,219,168,219,169,219,170,219,171,219,172,219,173,219,174,219,175,219,176,219,177,219,178,219,179,219,180,219,181,219,182,219,183,219,184,219,185,219,186,219,187,219,188,219,189,219,190,219,191,219,192,219,193,219,194,219,195,219,196,219,197,219,198,219,199,219,200,219,201,219,202,219,203,219,204,219,205,219,206,219,207,219,208,219,209,219,210,219,211,219,212,219,213,219,214,219,215,219,216,219,217,219,218,219,219,219,220,219,221,219,222,219,223,219,224,219,225,219,226,219,227,219,228,219,229,219,230,219,231,219,232,219,233,219,234,219,235,219,236,219,237,219,238,219,239,219,240,219,241,219,242,219,243,219,244,219,245,219,246,219,247,219,248,219,249,219,250,219,251,219,252,219,253,219,254,220,161,220,162,220,163,220,164,220,165,220,166,220,167,220,168,220,169,220,170,220,171,220,172,220,173,220,174,220,175,220,176,220,177,220,178,220,179,220,180,220,181,220,182,220,183,220,184,220,185,220,186,220,187,220,188,220,189,220,190,220,191,220,192,220,193,220,194,220,195,220,196,220,197,220,198,220,199,220,200,220,201,220,202,220,203,220,204,220,205,220,206,220,207,220,208,220,209,220,210,220,211,220,212,220,213,220,214,220,215,220,216,220,217,220,218,220,219,220,220,220,221,220,222,220,223,220,224,220,225,220,226,220,227,220,228,220,229,220,230,220,231,220,232,220,233,220,234,220,235,220,236,220,237,220,238,220,239,220,240,220,241,220,242,220,243,220,244,220,245,220,246,220,247,220,248,220,249,220,250,220,251,220,252,220,253,220,254,221,161,221,162,221,163,221,164,221,165,221,166,221,167,221,168,221,169,221,170,221,171,221,172,221,173,221,174,221,175,221,176,221,177,221,178,221,179,221,180,221,181,221,182,221,183,221,184,221,185,221,186,221,187,221,188,221,189,221,190,221,191,221,192,221,193,221,194,221,195,221,196,221,197,221,198,221,199,221,200,221,201,221,202,221,203,221,204,221,205,221,206,221,207,221,208,221,209,221,210,221,211,221,212,221,213,221,214,221,215,221,216,221,217,221,218,221,219,221,220,221,221,221,222,221,223,221,224,221,225,221,226,221,227,221,228,221,229,221,230,221,231,221,232,221,233,221,234,221,235,221,236,221,237,221,238,221,239,221,240,221,241,221,242,221,243,221,244,221,245,221,246,221,247,221,248,221,249,221,250,221,251,221,252,221,253,221,254,222,161,222,162,222,163,222,164,222,165,222,166,222,167,222,168,222,169,222,170,222,171,222,172,222,173,222,174,222,175,222,176,222,177,222,178,222,179,222,180,222,181,222,182,222,183,222,184,222,185,222,186,222,187,222,188,222,189,222,190,222,191,222,192,222,193,222,194,222,195,222,196,222,197,222,198,222,199,222,200,222,201,222,202,222,203,222,204,222,205,222,206,222,207,222,208,222,209,222,210,222,211,222,212,222,213,222,214,222,215,222,216,222,217,222,218,222,219,222,220,222,221,222,222,222,223,222,224,222,225,222,226,222,227,222,228,222,229,222,230,222,231,222,232,222,233,222,234,222,235,222,236,222,237,222,238,222,239,222,240,222,241,222,242,222,243,222,244,222,245,222,246,222,247,222,248,222,249,222,250,222,251,222,252,222,253,222,254,223,161,223,162,223,163,223,164,223,165,223,166,223,167,223,168,223,169,223,170,223,171,223,172,223,173,223,174,223,175,223,176,223,177,223,178,223,179,223,180,223,181,223,182,223,183,223,184,223,185,223,186,223,187,223,188,223,189,223,190,223,191,223,192,223,193,223,194,223,195,223,196,223,197,223,198,223,199,223,200,223,201,223,202,223,203,223,204,223,205,223,206,223,207,223,208,223,209,223,210,223,211,223,212,223,213,223,214,223,215,223,216,223,217,223,218,223,219,223,220,223,221,223,222,223,223,223,224,223,225,223,226,223,227,223,228,223,229,223,230,223,231,223,232,223,233,223,234,223,235,223,236,223,237,223,238,223,239,223,240,223,241,223,242,223,243,223,244,223,245,223,246,223,247,223,248,223,249,223,250,223,251,223,252,223,253,223,254,224,161,224,162,224,163,224,164,224,165,224,166,224,167,224,168,224,169,224,170,224,171,224,172,224,173,224,174,224,175,224,176,224,177,224,178,224,179,224,180,224,181,224,182,224,183,224,184,224,185,224,186,224,187,224,188,224,189,224,190,224,191,224,192,224,193,224,194,224,195,224,196,224,197,224,198,224,199,224,200,224,201,224,202,224,203,224,204,224,205,224,206,224,207,224,208,224,209,224,210,224,211,224,212,224,213,224,214,224,215,224,216,224,217,224,218,224,219,224,220,224,221,224,222,224,223,224,224,224,225,224,226,224,227,224,228,224,229,224,230,224,231,224,232,224,233,224,234,224,235,224,236,224,237,224,238,224,239,224,240,224,241,224,242,224,243,224,244,224,245,224,246,224,247,224,248,224,249,224,250,224,251,224,252,224,253,224,254,225,161,225,162,225,163,225,164,225,165,225,166,225,167,225,168,225,169,225,170,225,171,225,172,225,173,225,174,225,175,225,176,225,177,225,178,225,179,225,180,225,181,225,182,225,183,225,184,225,185,225,186,225,187,225,188,225,189,225,190,225,191,225,192,225,193,225,194,225,195,225,196,225,197,225,198,225,199,225,200,225,201,225,202,225,203,225,204,225,205,225,206,225,207,225,208,225,209,225,210,225,211,225,212,225,213,225,214,225,215,225,216,225,217,225,218,225,219,225,220,225,221,225,222,225,223,225,224,225,225,225,226,225,227,225,228,225,229,225,230,225,231,225,232,225,233,225,234,225,235,225,236,225,237,225,238,225,239,225,240,225,241,225,242,225,243,225,244,225,245,225,246,225,247,225,248,225,249,225,250,225,251,225,252,225,253,225,254,226,161,226,162,226,163,226,164,226,165,226,166,226,167,226,168,226,169,226,170,226,171,226,172,226,173,226,174,226,175,226,176,226,177,226,178,226,179,226,180,226,181,226,182,226,183,226,184,226,185,226,186,226,187,226,188,226,189,226,190,226,191,226,192,226,193,226,194,226,195,226,196,226,197,226,198,226,199,226,200,226,201,226,202,226,203,226,204,226,205,226,206,226,207,226,208,226,209,226,210,226,211,226,212,226,213,226,214,226,215,226,216,226,217,226,218,226,219,226,220,226,221,226,222,226,223,226,224,226,225,226,226,226,227,226,228,226,229,226,230,226,231,226,232,226,233,226,234,226,235,226,236,226,237,226,238,226,239,226,240,226,241,226,242,226,243,226,244,226,245,226,246,226,247,226,248,226,249,226,250,226,251,226,252,226,253,226,254,227,161,227,162,227,163,227,164,227,165,227,166,227,167,227,168,227,169,227,170,227,171,227,172,227,173,227,174,227,175,227,176,227,177,227,178,227,179,227,180,227,181,227,182,227,183,227,184,227,185,227,186,227,187,227,188,227,189,227,190,227,191,227,192,227,193,227,194,227,195,227,196,227,197,227,198,227,199,227,200,227,201,227,202,227,203,227,204,227,205,227,206,227,207,227,208,227,209,227,210,227,211,227,212,227,213,227,214,227,215,227,216,227,217,227,218,227,219,227,220,227,221,227,222,227,223,227,224,227,225,227,226,227,227,227,228,227,229,227,230,227,231,227,232,227,233,227,234,227,235,227,236,227,237,227,238,227,239,227,240,227,241,227,242,227,243,227,244,227,245,227,246,227,247,227,248,227,249,227,250,227,251,227,252,227,253,227,254,228,161,228,162,228,163,228,164,228,165,228,166,228,167,228,168,228,169,228,170,228,171,228,172,228,173,228,174,228,175,228,176,228,177,228,178,228,179,228,180,228,181,228,182,228,183,228,184,228,185,228,186,228,187,228,188,228,189,228,190,228,191,228,192,228,193,228,194,228,195,228,196,228,197,228,198,228,199,228,200,228,201,228,202,228,203,228,204,228,205,228,206,228,207,228,208,228,209,228,210,228,211,228,212,228,213,228,214,228,215,228,216,228,217,228,218,228,219,228,220,228,221,228,222,228,223,228,224,228,225,228,226,228,227,228,228,228,229,228,230,228,231,228,232,228,233,228,234,228,235,228,236,228,237,228,238,228,239,228,240,228,241,228,242,228,243,228,244,228,245,228,246,228,247,228,248,228,249,228,250,228,251,228,252,228,253,228,254,229,161,229,162,229,163,229,164,229,165,229,166,229,167,229,168,229,169,229,170,229,171,229,172,229,173,229,174,229,175,229,176,229,177,229,178,229,179,229,180,229,181,229,182,229,183,229,184,229,185,229,186,229,187,229,188,229,189,229,190,229,191,229,192,229,193,229,194,229,195,229,196,229,197,229,198,229,199,229,200,229,201,229,202,229,203,229,204,229,205,229,206,229,207,229,208,229,209,229,210,229,211,229,212,229,213,229,214,229,215,229,216,229,217,229,218,229,219,229,220,229,221,229,222,229,223,229,224,229,225,229,226,229,227,229,228,229,229,229,230,229,231,229,232,229,233,229,234,229,235,229,236,229,237,229,238,229,239,229,240,229,241,229,242,229,243,229,244,229,245,229,246,229,247,229,248,229,249,229,250,229,251,229,252,229,253,229,254,230,161,230,162,230,163,230,164,230,165,230,166,230,167,230,168,230,169,230,170,230,171,230,172,230,173,230,174,230,175,230,176,230,177,230,178,230,179,230,180,230,181,230,182,230,183,230,184,230,185,230,186,230,187,230,188,230,189,230,190,230,191,230,192,230,193,230,194,230,195,230,196,230,197,230,198,230,199,230,200,230,201,230,202,230,203,230,204,230,205,230,206,230,207,230,208,230,209,230,210,230,211,230,212,230,213,230,214,230,215,230,216,230,217,230,218,230,219,230,220,230,221,230,222,230,223,230,224,230,225,230,226,230,227,230,228,230,229,230,230,230,231,230,232,230,233,230,234,230,235,230,236,230,237,230,238,230,239,230,240,230,241,230,242,230,243,230,244,230,245,230,246,230,247,230,248,230,249,230,250,230,251,230,252,230,253,230,254,231,161,231,162,231,163,231,164,231,165,231,166,231,167,231,168,231,169,231,170,231,171,231,172,231,173,231,174,231,175,231,176,231,177,231,178,231,179,231,180,231,181,231,182,231,183,231,184,231,185,231,186,231,187,231,188,231,189,231,190,231,191,231,192,231,193,231,194,231,195,231,196,231,197,231,198,231,199,231,200,231,201,231,202,231,203,231,204,231,205,231,206,231,207,231,208,231,209,231,210,231,211,231,212,231,213,231,214,231,215,231,216,231,217,231,218,231,219,231,220,231,221,231,222,231,223,231,224,231,225,231,226,231,227,231,228,231,229,231,230,231,231,231,232,231,233,231,234,231,235,231,236,231,237,231,238,231,239,231,240,231,241,231,242,231,243,231,244,231,245,231,246,231,247,231,248,231,249,231,250,231,251,231,252,231,253,231,254,232,161,232,162,232,163,232,164,232,165,232,166,232,167,232,168,232,169,232,170,232,171,232,172,232,173,232,174,232,175,232,176,232,177,232,178,232,179,232,180,232,181,232,182,232,183,232,184,232,185,232,186,232,187,232,188,232,189,232,190,232,191,232,192,232,193,232,194,232,195,232,196,232,197,232,198,232,199,232,200,232,201,232,202,232,203,232,204,232,205,232,206,232,207,232,208,232,209,232,210,232,211,232,212,232,213,232,214,232,215,232,216,232,217,232,218,232,219,232,220,232,221,232,222,232,223,232,224,232,225,232,226,232,227,232,228,232,229,232,230,232,231,232,232,232,233,232,234,232,235,232,236,232,237,232,238,232,239,232,240,232,241,232,242,232,243,232,244,232,245,232,246,232,247,232,248,232,249,232,250,232,251,232,252,232,253,232,254,233,161,233,162,233,163,233,164,233,165,233,166,233,167,233,168,233,169,233,170,233,171,233,172,233,173,233,174,233,175,233,176,233,177,233,178,233,179,233,180,233,181,233,182,233,183,233,184,233,185,233,186,233,187,233,188,233,189,233,190,233,191,233,192,233,193,233,194,233,195,233,196,233,197,233,198,233,199,233,200,233,201,233,202,233,203,233,204,233,205,233,206,233,207,233,208,233,209,233,210,233,211,233,212,233,213,233,214,233,215,233,216,233,217,233,218,233,219,233,220,233,221,233,222,233,223,233,224,233,225,233,226,233,227,233,228,233,229,233,230,233,231,233,232,233,233,233,234,233,235,233,236,233,237,233,238,233,239,233,240,233,241,233,242,233,243,233,244,233,245,233,246,233,247,233,248,233,249,233,250,233,251,233,252,233,253,233,254,234,161,234,162,234,163,234,164,234,165,234,166,234,167,234,168,234,169,234,170,234,171,234,172,234,173,234,174,234,175,234,176,234,177,234,178,234,179,234,180,234,181,234,182,234,183,234,184,234,185,234,186,234,187,234,188,234,189,234,190,234,191,234,192,234,193,234,194,234,195,234,196,234,197,234,198,234,199,234,200,234,201,234,202,234,203,234,204,234,205,234,206,234,207,234,208,234,209,234,210,234,211,234,212,234,213,234,214,234,215,234,216,234,217,234,218,234,219,234,220,234,221,234,222,234,223,234,224,234,225,234,226,234,227,234,228,234,229,234,230,234,231,234,232,234,233,234,234,234,235,234,236,234,237,234,238,234,239,234,240,234,241,234,242,234,243,234,244,234,245,234,246,234,247,234,248,234,249,234,250,234,251,234,252,234,253,234,254,235,161,235,162,235,163,235,164,235,165,235,166,235,167,235,168,235,169,235,170,235,171,235,172,235,173,235,174,235,175,235,176,235,177,235,178,235,179,235,180,235,181,235,182,235,183,235,184,235,185,235,186,235,187,235,188,235,189,235,190,235,191,235,192,235,193,235,194,235,195,235,196,235,197,235,198,235,199,235,200,235,201,235,202,235,203,235,204,235,205,235,206,235,207,235,208,235,209,235,210,235,211,235,212,235,213,235,214,235,215,235,216,235,217,235,218,235,219,235,220,235,221,235,222,235,223,235,224,235,225,235,226,235,227,235,228,235,229,235,230,235,231,235,232,235,233,235,234,235,235,235,236,235,237,235,238,235,239,235,240,235,241,235,242,235,243,235,244,235,245,235,246,235,247,235,248,235,249,235,250,235,251,235,252,235,253,235,254,236,161,236,162,236,163,236,164,236,165,236,166,236,167,236,168,236,169,236,170,236,171,236,172,236,173,236,174,236,175,236,176,236,177,236,178,236,179,236,180,236,181,236,182,236,183,236,184,236,185,236,186,236,187,236,188,236,189,236,190,236,191,236,192,236,193,236,194,236,195,236,196,236,197,236,198,236,199,236,200,236,201,236,202,236,203,236,204,236,205,236,206,236,207,236,208,236,209,236,210,236,211,236,212,236,213,236,214,236,215,236,216,236,217,236,218,236,219,236,220,236,221,236,222,236,223,236,224,236,225,236,226,236,227,236,228,236,229,236,230,236,231,236,232,236,233,236,234,236,235,236,236,236,237,236,238,236,239,236,240,236,241,236,242,236,243,236,244,236,245,236,246,236,247,236,248,236,249,236,250,236,251,236,252,236,253,236,254,237,161,237,162,237,163,237,164,237,165,237,166,237,167,237,168,237,169,237,170,237,171,237,172,237,173,237,174,237,175,237,176,237,177,237,178,237,179,237,180,237,181,237,182,237,183,237,184,237,185,237,186,237,187,237,188,237,189,237,190,237,191,237,192,237,193,237,194,237,195,237,196,237,197,237,198,237,199,237,200,237,201,237,202,237,203,237,204,237,205,237,206,237,207,237,208,237,209,237,210,237,211,237,212,237,213,237,214,237,215,237,216,237,217,237,218,237,219,237,220,237,221,237,222,237,223,237,224,237,225,237,226,237,227,237,228,237,229,237,230,237,231,237,232,237,233,237,234,237,235,237,236,237,237,237,238,237,239,237,240,237,241,237,242,237,243,237,244,237,245,237,246,237,247,237,248,237,249,237,250,237,251,237,252,237,253,237,254,238,161,238,162,238,163,238,164,238,165,238,166,238,167,238,168,238,169,238,170,238,171,238,172,238,173,238,174,238,175,238,176,238,177,238,178,238,179,238,180,238,181,238,182,238,183,238,184,238,185,238,186,238,187,238,188,238,189,238,190,238,191,238,192,238,193,238,194,238,195,238,196,238,197,238,198,238,199,238,200,238,201,238,202,238,203,238,204,238,205,238,206,238,207,238,208,238,209,238,210,238,211,238,212,238,213,238,214,238,215,238,216,238,217,238,218,238,219,238,220,238,221,238,222,238,223,238,224,238,225,238,226,238,227,238,228,238,229,238,230,238,231,238,232,238,233,238,234,238,235,238,236,238,237,238,238,238,239,238,240,238,241,238,242,238,243,238,244,238,245,238,246,238,247,238,248,238,249,238,250,238,251,238,252,238,253,238,254,239,161,239,162,239,163,239,164,239,165,239,166,239,167,239,168,239,169,239,170,239,171,239,172,239,173,239,174,239,175,239,176,239,177,239,178,239,179,239,180,239,181,239,182,239,183,239,184,239,185,239,186,239,187,239,188,239,189,239,190,239,191,239,192,239,193,239,194,239,195,239,196,239,197,239,198,239,199,239,200,239,201,239,202,239,203,239,204,239,205,239,206,239,207,239,208,239,209,239,210,239,211,239,212,239,213,239,214,239,215,239,216,239,217,239,218,239,219,239,220,239,221,239,222,239,223,239,224,239,225,239,226,239,227,239,228,239,229,239,230,239,231,239,232,239,233,239,234,239,235,239,236,239,237,239,238,239,239,239,240,239,241,239,242,239,243,239,244,239,245,239,246,239,247,239,248,239,249,239,250,239,251,239,252,239,253,239,254,240,161,240,162,240,163,240,164,240,165,240,166,240,167,240,168,240,169,240,170,240,171,240,172,240,173,240,174,240,175,240,176,240,177,240,178,240,179,240,180,240,181,240,182,240,183,240,184,240,185,240,186,240,187,240,188,240,189,240,190,240,191,240,192,240,193,240,194,240,195,240,196,240,197,240,198,240,199,240,200,240,201,240,202,240,203,240,204,240,205,240,206,240,207,240,208,240,209,240,210,240,211,240,212,240,213,240,214,240,215,240,216,240,217,240,218,240,219,240,220,240,221,240,222,240,223,240,224,240,225,240,226,240,227,240,228,240,229,240,230,240,231,240,232,240,233,240,234,240,235,240,236,240,237,240,238,240,239,240,240,240,241,240,242,240,243,240,244,240,245,240,246,240,247,240,248,240,249,240,250,240,251,240,252,240,253,240,254,241,161,241,162,241,163,241,164,241,165,241,166,241,167,241,168,241,169,241,170,241,171,241,172,241,173,241,174,241,175,241,176,241,177,241,178,241,179,241,180,241,181,241,182,241,183,241,184,241,185,241,186,241,187,241,188,241,189,241,190,241,191,241,192,241,193,241,194,241,195,241,196,241,197,241,198,241,199,241,200,241,201,241,202,241,203,241,204,241,205,241,206,241,207,241,208,241,209,241,210,241,211,241,212,241,213,241,214,241,215,241,216,241,217,241,218,241,219,241,220,241,221,241,222,241,223,241,224,241,225,241,226,241,227,241,228,241,229,241,230,241,231,241,232,241,233,241,234,241,235,241,236,241,237,241,238,241,239,241,240,241,241,241,242,241,243,241,244,241,245,241,246,241,247,241,248,241,249,241,250,241,251,241,252,241,253,241,254,242,161,242,162,242,163,242,164,242,165,242,166,242,167,242,168,242,169,242,170,242,171,242,172,242,173,242,174,242,175,242,176,242,177,242,178,242,179,242,180,242,181,242,182,242,183,242,184,242,185,242,186,242,187,242,188,242,189,242,190,242,191,242,192,242,193,242,194,242,195,242,196,242,197,242,198,242,199,242,200,242,201,242,202,242,203,242,204,242,205,242,206,242,207,242,208,242,209,242,210,242,211,242,212,242,213,242,214,242,215,242,216,242,217,242,218,242,219,242,220,242,221,242,222,242,223,242,224,242,225,242,226,242,227,242,228,242,229,242,230,242,231,242,232,242,233,242,234,242,235,242,236,242,237,242,238,242,239,242,240,242,241,242,242,242,243,242,244,242,245,242,246,242,247,242,248,242,249,242,250,242,251,242,252,242,253,242,254,243,161,243,162,243,163,243,164,243,165,243,166,243,167,243,168,243,169,243,170,243,171,243,172,243,173,243,174,243,175,243,176,243,177,243,178,243,179,243,180,243,181,243,182,243,183,243,184,243,185,243,186,243,187,243,188,243,189,243,190,243,191,243,192,243,193,243,194,243,195,243,196,243,197,243,198,243,199,243,200,243,201,243,202,243,203,243,204,243,205,243,206,243,207,243,208,243,209,243,210,243,211,243,212,243,213,243,214,243,215,243,216,243,217,243,218,243,219,243,220,243,221,243,222,243,223,243,224,243,225,243,226,243,227,243,228,243,229,243,230,243,231,243,232,243,233,243,234,243,235,243,236,243,237,243,238,243,239,243,240,243,241,243,242,243,243,243,244,243,245,243,246,243,247,243,248,243,249,243,250,243,251,243,252,243,253,243,254,244,161,244,162,244,163,244,164,244,165,244,166,162,232];
+    var string = "\u3000\u3001\u3002\uFF0C\uFF0E\u30FB\uFF1A\uFF1B\uFF1F\uFF01\u309B\u309C\u00B4\uFF40\u00A8\uFF3E\uFFE3\uFF3F\u30FD\u30FE\u309D\u309E\u3003\u4EDD\u3005\u3006\u3007\u30FC\u2015\u2010\uFF0F\uFF3C\uFF5C\u2026\u2025\u2018\u2019\u201C\u201D\uFF08\uFF09\u3014\u3015\uFF3B\uFF3D\uFF5B\uFF5D\u3008\u3009\u300A\u300B\u300C\u300D\u300E\u300F\u3010\u3011\uFF0B\u00B1\u00D7\u00F7\uFF1D\u2260\uFF1C\uFF1E\u2266\u2267\u221E\u2234\u2642\u2640\u00B0\u2032\u2033\u2103\uFFE5\uFF04\uFF05\uFF03\uFF06\uFF0A\uFF20\u00A7\u2606\u2605\u25CB\u25CF\u25CE\u25C7\u25C6\u25A1\u25A0\u25B3\u25B2\u25BD\u25BC\u203B\u3012\u2192\u2190\u2191\u2193\u3013\u2208\u220B\u2286\u2287\u2282\u2283\u222A\u2229\u2227\u2228\u21D2\u21D4\u2200\u2203\u2220\u22A5\u2312\u2202\u2207\u2261\u2252\u226A\u226B\u221A\u223D\u221D\u2235\u222B\u222C\u212B\u2030\u266F\u266D\u266A\u2020\u2021\u00B6\u25EF\uFF10\uFF11\uFF12\uFF13\uFF14\uFF15\uFF16\uFF17\uFF18\uFF19\uFF21\uFF22\uFF23\uFF24\uFF25\uFF26\uFF27\uFF28\uFF29\uFF2A\uFF2B\uFF2C\uFF2D\uFF2E\uFF2F\uFF30\uFF31\uFF32\uFF33\uFF34\uFF35\uFF36\uFF37\uFF38\uFF39\uFF3A\uFF41\uFF42\uFF43\uFF44\uFF45\uFF46\uFF47\uFF48\uFF49\uFF4A\uFF4B\uFF4C\uFF4D\uFF4E\uFF4F\uFF50\uFF51\uFF52\uFF53\uFF54\uFF55\uFF56\uFF57\uFF58\uFF59\uFF5A\u3041\u3042\u3043\u3044\u3045\u3046\u3047\u3048\u3049\u304A\u304B\u304C\u304D\u304E\u304F\u3050\u3051\u3052\u3053\u3054\u3055\u3056\u3057\u3058\u3059\u305A\u305B\u305C\u305D\u305E\u305F\u3060\u3061\u3062\u3063\u3064\u3065\u3066\u3067\u3068\u3069\u306A\u306B\u306C\u306D\u306E\u306F\u3070\u3071\u3072\u3073\u3074\u3075\u3076\u3077\u3078\u3079\u307A\u307B\u307C\u307D\u307E\u307F\u3080\u3081\u3082\u3083\u3084\u3085\u3086\u3087\u3088\u3089\u308A\u308B\u308C\u308D\u308E\u308F\u3090\u3091\u3092\u3093\u30A1\u30A2\u30A3\u30A4\u30A5\u30A6\u30A7\u30A8\u30A9\u30AA\u30AB\u30AC\u30AD\u30AE\u30AF\u30B0\u30B1\u30B2\u30B3\u30B4\u30B5\u30B6\u30B7\u30B8\u30B9\u30BA\u30BB\u30BC\u30BD\u30BE\u30BF\u30C0\u30C1\u30C2\u30C3\u30C4\u30C5\u30C6\u30C7\u30C8\u30C9\u30CA\u30CB\u30CC\u30CD\u30CE\u30CF\u30D0\u30D1\u30D2\u30D3\u30D4\u30D5\u30D6\u30D7\u30D8\u30D9\u30DA\u30DB\u30DC\u30DD\u30DE\u30DF\u30E0\u30E1\u30E2\u30E3\u30E4\u30E5\u30E6\u30E7\u30E8\u30E9\u30EA\u30EB\u30EC\u30ED\u30EE\u30EF\u30F0\u30F1\u30F2\u30F3\u30F4\u30F5\u30F6\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039A\u039B\u039C\u039D\u039E\u039F\u03A0\u03A1\u03A3\u03A4\u03A5\u03A6\u03A7\u03A8\u03A9\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA\u03BB\u03BC\u03BD\u03BE\u03BF\u03C0\u03C1\u03C3\u03C4\u03C5\u03C6\u03C7\u03C8\u03C9\u0410\u0411\u0412\u0413\u0414\u0415\u0401\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F\u0430\u0431\u0432\u0433\u0434\u0435\u0451\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F\u2500\u2502\u250C\u2510\u2518\u2514\u251C\u252C\u2524\u2534\u253C\u2501\u2503\u250F\u2513\u251B\u2517\u2523\u2533\u252B\u253B\u254B\u2520\u252F\u2528\u2537\u253F\u251D\u2530\u2525\u2538\u2542\u2252\u2261\u222B\u221A\u22A5\u2220\u2235\u2229\u222A\u4E9C\u5516\u5A03\u963F\u54C0\u611B\u6328\u59F6\u9022\u8475\u831C\u7A50\u60AA\u63E1\u6E25\u65ED\u8466\u82A6\u9BF5\u6893\u5727\u65A1\u6271\u5B9B\u59D0\u867B\u98F4\u7D62\u7DBE\u9B8E\u6216\u7C9F\u88B7\u5B89\u5EB5\u6309\u6697\u6848\u95C7\u978D\u674F\u4EE5\u4F0A\u4F4D\u4F9D\u5049\u56F2\u5937\u59D4\u5A01\u5C09\u60DF\u610F\u6170\u6613\u6905\u70BA\u754F\u7570\u79FB\u7DAD\u7DEF\u80C3\u840E\u8863\u8B02\u9055\u907A\u533B\u4E95\u4EA5\u57DF\u80B2\u90C1\u78EF\u4E00\u58F1\u6EA2\u9038\u7A32\u8328\u828B\u9C2F\u5141\u5370\u54BD\u54E1\u56E0\u59FB\u5F15\u98F2\u6DEB\u80E4\u852D\u9662\u9670\u96A0\u97FB\u540B\u53F3\u5B87\u70CF\u7FBD\u8FC2\u96E8\u536F\u9D5C\u7ABA\u4E11\u7893\u81FC\u6E26\u5618\u5504\u6B1D\u851A\u9C3B\u59E5\u53A9\u6D66\u74DC\u958F\u5642\u4E91\u904B\u96F2\u834F\u990C\u53E1\u55B6\u5B30\u5F71\u6620\u66F3\u6804\u6C38\u6CF3\u6D29\u745B\u76C8\u7A4E\u9834\u82F1\u885B\u8A60\u92ED\u6DB2\u75AB\u76CA\u99C5\u60A6\u8B01\u8D8A\u95B2\u698E\u53AD\u5186\u5712\u5830\u5944\u5BB4\u5EF6\u6028\u63A9\u63F4\u6CBF\u6F14\u708E\u7114\u7159\u71D5\u733F\u7E01\u8276\u82D1\u8597\u9060\u925B\u9D1B\u5869\u65BC\u6C5A\u7525\u51F9\u592E\u5965\u5F80\u5FDC\u62BC\u65FA\u6A2A\u6B27\u6BB4\u738B\u7FC1\u8956\u9D2C\u9D0E\u9EC4\u5CA1\u6C96\u837B\u5104\u5C4B\u61B6\u81C6\u6876\u7261\u4E59\u4FFA\u5378\u6069\u6E29\u7A4F\u97F3\u4E0B\u5316\u4EEE\u4F55\u4F3D\u4FA1\u4F73\u52A0\u53EF\u5609\u590F\u5AC1\u5BB6\u5BE1\u79D1\u6687\u679C\u67B6\u6B4C\u6CB3\u706B\u73C2\u798D\u79BE\u7A3C\u7B87\u82B1\u82DB\u8304\u8377\u83EF\u83D3\u8766\u8AB2\u5629\u8CA8\u8FE6\u904E\u971E\u868A\u4FC4\u5CE8\u6211\u7259\u753B\u81E5\u82BD\u86FE\u8CC0\u96C5\u9913\u99D5\u4ECB\u4F1A\u89E3\u56DE\u584A\u58CA\u5EFB\u5FEB\u602A\u6094\u6062\u61D0\u6212\u62D0\u6539\u9B41\u6666\u68B0\u6D77\u7070\u754C\u7686\u7D75\u82A5\u87F9\u958B\u968E\u8C9D\u51F1\u52BE\u5916\u54B3\u5BB3\u5D16\u6168\u6982\u6DAF\u788D\u84CB\u8857\u8A72\u93A7\u9AB8\u6D6C\u99A8\u86D9\u57A3\u67FF\u86CE\u920E\u5283\u5687\u5404\u5ED3\u62E1\u64B9\u683C\u6838\u6BBB\u7372\u78BA\u7A6B\u899A\u89D2\u8D6B\u8F03\u90ED\u95A3\u9694\u9769\u5B66\u5CB3\u697D\u984D\u984E\u639B\u7B20\u6A2B\u6A7F\u68B6\u9C0D\u6F5F\u5272\u559D\u6070\u62EC\u6D3B\u6E07\u6ED1\u845B\u8910\u8F44\u4E14\u9C39\u53F6\u691B\u6A3A\u9784\u682A\u515C\u7AC3\u84B2\u91DC\u938C\u565B\u9D28\u6822\u8305\u8431\u7CA5\u5208\u82C5\u74E6\u4E7E\u4F83\u51A0\u5BD2\u520A\u52D8\u52E7\u5DFB\u559A\u582A\u59E6\u5B8C\u5B98\u5BDB\u5E72\u5E79\u60A3\u611F\u6163\u61BE\u63DB\u6562\u67D1\u6853\u68FA\u6B3E\u6B53\u6C57\u6F22\u6F97\u6F45\u74B0\u7518\u76E3\u770B\u7AFF\u7BA1\u7C21\u7DE9\u7F36\u7FF0\u809D\u8266\u839E\u89B3\u8ACC\u8CAB\u9084\u9451\u9593\u9591\u95A2\u9665\u97D3\u9928\u8218\u4E38\u542B\u5CB8\u5DCC\u73A9\u764C\u773C\u5CA9\u7FEB\u8D0B\u96C1\u9811\u9854\u9858\u4F01\u4F0E\u5371\u559C\u5668\u57FA\u5947\u5B09\u5BC4\u5C90\u5E0C\u5E7E\u5FCC\u63EE\u673A\u65D7\u65E2\u671F\u68CB\u68C4\u6A5F\u5E30\u6BC5\u6C17\u6C7D\u757F\u7948\u5B63\u7A00\u7D00\u5FBD\u898F\u8A18\u8CB4\u8D77\u8ECC\u8F1D\u98E2\u9A0E\u9B3C\u4E80\u507D\u5100\u5993\u5B9C\u622F\u6280\u64EC\u6B3A\u72A0\u7591\u7947\u7FA9\u87FB\u8ABC\u8B70\u63AC\u83CA\u97A0\u5409\u5403\u55AB\u6854\u6A58\u8A70\u7827\u6775\u9ECD\u5374\u5BA2\u811A\u8650\u9006\u4E18\u4E45\u4EC7\u4F11\u53CA\u5438\u5BAE\u5F13\u6025\u6551\u673D\u6C42\u6C72\u6CE3\u7078\u7403\u7A76\u7AAE\u7B08\u7D1A\u7CFE\u7D66\u65E7\u725B\u53BB\u5C45\u5DE8\u62D2\u62E0\u6319\u6E20\u865A\u8A31\u8DDD\u92F8\u6F01\u79A6\u9B5A\u4EA8\u4EAB\u4EAC\u4F9B\u4FA0\u50D1\u5147\u7AF6\u5171\u51F6\u5354\u5321\u537F\u53EB\u55AC\u5883\u5CE1\u5F37\u5F4A\u602F\u6050\u606D\u631F\u6559\u6A4B\u6CC1\u72C2\u72ED\u77EF\u80F8\u8105\u8208\u854E\u90F7\u93E1\u97FF\u9957\u9A5A\u4EF0\u51DD\u5C2D\u6681\u696D\u5C40\u66F2\u6975\u7389\u6850\u7C81\u50C5\u52E4\u5747\u5DFE\u9326\u65A4\u6B23\u6B3D\u7434\u7981\u79BD\u7B4B\u7DCA\u82B9\u83CC\u887F\u895F\u8B39\u8FD1\u91D1\u541F\u9280\u4E5D\u5036\u53E5\u533A\u72D7\u7396\u77E9\u82E6\u8EAF\u99C6\u99C8\u99D2\u5177\u611A\u865E\u55B0\u7A7A\u5076\u5BD3\u9047\u9685\u4E32\u6ADB\u91E7\u5C51\u5C48\u6398\u7A9F\u6C93\u9774\u8F61\u7AAA\u718A\u9688\u7C82\u6817\u7E70\u6851\u936C\u52F2\u541B\u85AB\u8A13\u7FA4\u8ECD\u90E1\u5366\u8888\u7941\u4FC2\u50BE\u5211\u5144\u5553\u572D\u73EA\u578B\u5951\u5F62\u5F84\u6075\u6176\u6167\u61A9\u63B2\u643A\u656C\u666F\u6842\u6E13\u7566\u7A3D\u7CFB\u7D4C\u7D99\u7E4B\u7F6B\u830E\u834A\u86CD\u8A08\u8A63\u8B66\u8EFD\u981A\u9D8F\u82B8\u8FCE\u9BE8\u5287\u621F\u6483\u6FC0\u9699\u6841\u5091\u6B20\u6C7A\u6F54\u7A74\u7D50\u8840\u8A23\u6708\u4EF6\u5039\u5026\u5065\u517C\u5238\u5263\u55A7\u570F\u5805\u5ACC\u5EFA\u61B2\u61F8\u62F3\u6372\u691C\u6A29\u727D\u72AC\u732E\u7814\u786F\u7D79\u770C\u80A9\u898B\u8B19\u8CE2\u8ED2\u9063\u9375\u967A\u9855\u9A13\u9E78\u5143\u539F\u53B3\u5E7B\u5F26\u6E1B\u6E90\u7384\u73FE\u7D43\u8237\u8A00\u8AFA\u9650\u4E4E\u500B\u53E4\u547C\u56FA\u59D1\u5B64\u5DF1\u5EAB\u5F27\u6238\u6545\u67AF\u6E56\u72D0\u7CCA\u88B4\u80A1\u80E1\u83F0\u864E\u8A87\u8DE8\u9237\u96C7\u9867\u9F13\u4E94\u4E92\u4F0D\u5348\u5449\u543E\u5A2F\u5F8C\u5FA1\u609F\u68A7\u6A8E\u745A\u7881\u8A9E\u8AA4\u8B77\u9190\u4E5E\u9BC9\u4EA4\u4F7C\u4FAF\u5019\u5016\u5149\u516C\u529F\u52B9\u52FE\u539A\u53E3\u5411\u540E\u5589\u5751\u57A2\u597D\u5B54\u5B5D\u5B8F\u5DE5\u5DE7\u5DF7\u5E78\u5E83\u5E9A\u5EB7\u5F18\u6052\u614C\u6297\u62D8\u63A7\u653B\u6602\u6643\u66F4\u676D\u6821\u6897\u69CB\u6C5F\u6D2A\u6D69\u6E2F\u6E9D\u7532\u7687\u786C\u7A3F\u7CE0\u7D05\u7D18\u7D5E\u7DB1\u8015\u8003\u80AF\u80B1\u8154\u818F\u822A\u8352\u884C\u8861\u8B1B\u8CA2\u8CFC\u90CA\u9175\u9271\u783F\u92FC\u95A4\u964D\u9805\u9999\u9AD8\u9D3B\u525B\u52AB\u53F7\u5408\u58D5\u62F7\u6FE0\u8C6A\u8F5F\u9EB9\u514B\u523B\u544A\u56FD\u7A40\u9177\u9D60\u9ED2\u7344\u6F09\u8170\u7511\u5FFD\u60DA\u9AA8\u72DB\u8FBC\u6B64\u9803\u4ECA\u56F0\u5764\u58BE\u5A5A\u6068\u61C7\u660F\u6606\u6839\u68B1\u6DF7\u75D5\u7D3A\u826E\u9B42\u4E9B\u4F50\u53C9\u5506\u5D6F\u5DE6\u5DEE\u67FB\u6C99\u7473\u7802\u8A50\u9396\u88DF\u5750\u5EA7\u632B\u50B5\u50AC\u518D\u6700\u54C9\u585E\u59BB\u5BB0\u5F69\u624D\u63A1\u683D\u6B73\u6E08\u707D\u91C7\u7280\u7815\u7826\u796D\u658E\u7D30\u83DC\u88C1\u8F09\u969B\u5264\u5728\u6750\u7F6A\u8CA1\u51B4\u5742\u962A\u583A\u698A\u80B4\u54B2\u5D0E\u57FC\u7895\u9DFA\u4F5C\u524A\u548B\u643E\u6628\u6714\u67F5\u7A84\u7B56\u7D22\u932F\u685C\u9BAD\u7B39\u5319\u518A\u5237\u5BDF\u62F6\u64AE\u64E6\u672D\u6BBA\u85A9\u96D1\u7690\u9BD6\u634C\u9306\u9BAB\u76BF\u6652\u4E09\u5098\u53C2\u5C71\u60E8\u6492\u6563\u685F\u71E6\u73CA\u7523\u7B97\u7E82\u8695\u8B83\u8CDB\u9178\u9910\u65AC\u66AB\u6B8B\u4ED5\u4ED4\u4F3A\u4F7F\u523A\u53F8\u53F2\u55E3\u56DB\u58EB\u59CB\u59C9\u59FF\u5B50\u5C4D\u5E02\u5E2B\u5FD7\u601D\u6307\u652F\u5B5C\u65AF\u65BD\u65E8\u679D\u6B62\u6B7B\u6C0F\u7345\u7949\u79C1\u7CF8\u7D19\u7D2B\u80A2\u8102\u81F3\u8996\u8A5E\u8A69\u8A66\u8A8C\u8AEE\u8CC7\u8CDC\u96CC\u98FC\u6B6F\u4E8B\u4F3C\u4F8D\u5150\u5B57\u5BFA\u6148\u6301\u6642\u6B21\u6ECB\u6CBB\u723E\u74BD\u75D4\u78C1\u793A\u800C\u8033\u81EA\u8494\u8F9E\u6C50\u9E7F\u5F0F\u8B58\u9D2B\u7AFA\u8EF8\u5B8D\u96EB\u4E03\u53F1\u57F7\u5931\u5AC9\u5BA4\u6089\u6E7F\u6F06\u75BE\u8CEA\u5B9F\u8500\u7BE0\u5072\u67F4\u829D\u5C61\u854A\u7E1E\u820E\u5199\u5C04\u6368\u8D66\u659C\u716E\u793E\u7D17\u8005\u8B1D\u8ECA\u906E\u86C7\u90AA\u501F\u52FA\u5C3A\u6753\u707C\u7235\u914C\u91C8\u932B\u82E5\u5BC2\u5F31\u60F9\u4E3B\u53D6\u5B88\u624B\u6731\u6B8A\u72E9\u73E0\u7A2E\u816B\u8DA3\u9152\u9996\u5112\u53D7\u546A\u5BFF\u6388\u6A39\u7DAC\u9700\u56DA\u53CE\u5468\u5B97\u5C31\u5DDE\u4FEE\u6101\u62FE\u6D32\u79C0\u79CB\u7D42\u7E4D\u7FD2\u81ED\u821F\u8490\u8846\u8972\u8B90\u8E74\u8F2F\u9031\u914B\u916C\u96C6\u919C\u4EC0\u4F4F\u5145\u5341\u5F93\u620E\u67D4\u6C41\u6E0B\u7363\u7E26\u91CD\u9283\u53D4\u5919\u5BBF\u6DD1\u795D\u7E2E\u7C9B\u587E\u719F\u51FA\u8853\u8FF0\u4FCA\u5CFB\u6625\u77AC\u7AE3\u821C\u99FF\u51C6\u5FAA\u65EC\u696F\u6B89\u6DF3\u6E96\u6F64\u76FE\u7D14\u5DE1\u9075\u9187\u9806\u51E6\u521D\u6240\u6691\u66D9\u6E1A\u5EB6\u7DD2\u7F72\u66F8\u85AF\u85F7\u8AF8\u52A9\u53D9\u5973\u5E8F\u5F90\u6055\u92E4\u9664\u50B7\u511F\u52DD\u5320\u5347\u53EC\u54E8\u5546\u5531\u5617\u5968\u59BE\u5A3C\u5BB5\u5C06\u5C0F\u5C11\u5C1A\u5E84\u5E8A\u5EE0\u5F70\u627F\u6284\u62DB\u638C\u6377\u6607\u660C\u662D\u6676\u677E\u68A2\u6A1F\u6A35\u6CBC\u6D88\u6E09\u6E58\u713C\u7126\u7167\u75C7\u7701\u785D\u7901\u7965\u79F0\u7AE0\u7B11\u7CA7\u7D39\u8096\u83D6\u848B\u8549\u885D\u88F3\u8A1F\u8A3C\u8A54\u8A73\u8C61\u8CDE\u91A4\u9266\u937E\u9418\u969C\u9798\u4E0A\u4E08\u4E1E\u4E57\u5197\u5270\u57CE\u5834\u58CC\u5B22\u5E38\u60C5\u64FE\u6761\u6756\u6D44\u72B6\u7573\u7A63\u84B8\u8B72\u91B8\u9320\u5631\u57F4\u98FE\u62ED\u690D\u6B96\u71ED\u7E54\u8077\u8272\u89E6\u98DF\u8755\u8FB1\u5C3B\u4F38\u4FE1\u4FB5\u5507\u5A20\u5BDD\u5BE9\u5FC3\u614E\u632F\u65B0\u664B\u68EE\u699B\u6D78\u6DF1\u7533\u75B9\u771F\u795E\u79E6\u7D33\u81E3\u82AF\u85AA\u89AA\u8A3A\u8EAB\u8F9B\u9032\u91DD\u9707\u4EBA\u4EC1\u5203\u5875\u58EC\u5C0B\u751A\u5C3D\u814E\u8A0A\u8FC5\u9663\u976D\u7B25\u8ACF\u9808\u9162\u56F3\u53A8\u9017\u5439\u5782\u5E25\u63A8\u6C34\u708A\u7761\u7C8B\u7FE0\u8870\u9042\u9154\u9310\u9318\u968F\u745E\u9AC4\u5D07\u5D69\u6570\u67A2\u8DA8\u96DB\u636E\u6749\u6919\u83C5\u9817\u96C0\u88FE\u6F84\u647A\u5BF8\u4E16\u702C\u755D\u662F\u51C4\u5236\u52E2\u59D3\u5F81\u6027\u6210\u653F\u6574\u661F\u6674\u68F2\u6816\u6B63\u6E05\u7272\u751F\u76DB\u7CBE\u8056\u58F0\u88FD\u897F\u8AA0\u8A93\u8ACB\u901D\u9192\u9752\u9759\u6589\u7A0E\u8106\u96BB\u5E2D\u60DC\u621A\u65A5\u6614\u6790\u77F3\u7A4D\u7C4D\u7E3E\u810A\u8CAC\u8D64\u8DE1\u8E5F\u78A9\u5207\u62D9\u63A5\u6442\u6298\u8A2D\u7A83\u7BC0\u8AAC\u96EA\u7D76\u820C\u8749\u4ED9\u5148\u5343\u5360\u5BA3\u5C02\u5C16\u5DDD\u6226\u6247\u64B0\u6813\u6834\u6CC9\u6D45\u6D17\u67D3\u6F5C\u714E\u717D\u65CB\u7A7F\u7BAD\u7DDA\u7E4A\u7FA8\u817A\u821B\u8239\u85A6\u8A6E\u8CCE\u8DF5\u9078\u9077\u92AD\u9291\u9583\u9BAE\u524D\u5584\u6F38\u7136\u5168\u7985\u7E55\u81B3\u7CCE\u564C\u5851\u5CA8\u63AA\u66FE\u66FD\u695A\u72D9\u758F\u758E\u790E\u7956\u79DF\u7C97\u7D20\u7D44\u8607\u8A34\u963B\u9061\u9F20\u50E7\u5275\u53CC\u53E2\u5009\u55AA\u58EE\u594F\u723D\u5B8B\u5C64\u531D\u60E3\u60F3\u635C\u6383\u633F\u63BB\u64CD\u65E9\u66F9\u5DE3\u69CD\u69FD\u6F15\u71E5\u4E89\u75E9\u76F8\u7A93\u7CDF\u7DCF\u7D9C\u8061\u8349\u8358\u846C\u84BC\u85FB\u88C5\u8D70\u9001\u906D\u9397\u971C\u9A12\u50CF\u5897\u618E\u81D3\u8535\u8D08\u9020\u4FC3\u5074\u5247\u5373\u606F\u6349\u675F\u6E2C\u8DB3\u901F\u4FD7\u5C5E\u8CCA\u65CF\u7D9A\u5352\u8896\u5176\u63C3\u5B58\u5B6B\u5C0A\u640D\u6751\u905C\u4ED6\u591A\u592A\u6C70\u8A51\u553E\u5815\u59A5\u60F0\u6253\u67C1\u8235\u6955\u9640\u99C4\u9A28\u4F53\u5806\u5BFE\u8010\u5CB1\u5E2F\u5F85\u6020\u614B\u6234\u66FF\u6CF0\u6EDE\u80CE\u817F\u82D4\u888B\u8CB8\u9000\u902E\u968A\u9EDB\u9BDB\u4EE3\u53F0\u5927\u7B2C\u918D\u984C\u9DF9\u6EDD\u7027\u5353\u5544\u5B85\u6258\u629E\u62D3\u6CA2\u6FEF\u7422\u8A17\u9438\u6FC1\u8AFE\u8338\u51E7\u86F8\u53EA\u53E9\u4F46\u9054\u8FB0\u596A\u8131\u5DFD\u7AEA\u8FBF\u68DA\u8C37\u72F8\u9C48\u6A3D\u8AB0\u4E39\u5358\u5606\u5766\u62C5\u63A2\u65E6\u6B4E\u6DE1\u6E5B\u70AD\u77ED\u7AEF\u7BAA\u7DBB\u803D\u80C6\u86CB\u8A95\u935B\u56E3\u58C7\u5F3E\u65AD\u6696\u6A80\u6BB5\u7537\u8AC7\u5024\u77E5\u5730\u5F1B\u6065\u667A\u6C60\u75F4\u7A1A\u7F6E\u81F4\u8718\u9045\u99B3\u7BC9\u755C\u7AF9\u7B51\u84C4\u9010\u79E9\u7A92\u8336\u5AE1\u7740\u4E2D\u4EF2\u5B99\u5FE0\u62BD\u663C\u67F1\u6CE8\u866B\u8877\u8A3B\u914E\u92F3\u99D0\u6A17\u7026\u732A\u82E7\u8457\u8CAF\u4E01\u5146\u51CB\u558B\u5BF5\u5E16\u5E33\u5E81\u5F14\u5F35\u5F6B\u5FB4\u61F2\u6311\u66A2\u671D\u6F6E\u7252\u753A\u773A\u8074\u8139\u8178\u8776\u8ABF\u8ADC\u8D85\u8DF3\u929A\u9577\u9802\u9CE5\u52C5\u6357\u76F4\u6715\u6C88\u73CD\u8CC3\u93AE\u9673\u6D25\u589C\u690E\u69CC\u8FFD\u939A\u75DB\u901A\u585A\u6802\u63B4\u69FB\u4F43\u6F2C\u67D8\u8FBB\u8526\u7DB4\u9354\u693F\u6F70\u576A\u58F7\u5B2C\u7D2C\u722A\u540A\u91E3\u9DB4\u4EAD\u4F4E\u505C\u5075\u5243\u8C9E\u5448\u5824\u5B9A\u5E1D\u5E95\u5EAD\u5EF7\u5F1F\u608C\u62B5\u633A\u63D0\u68AF\u6C40\u7887\u798E\u7A0B\u7DE0\u8247\u8A02\u8AE6\u8E44\u9013\u90B8\u912D\u91D8\u9F0E\u6CE5\u6458\u64E2\u6575\u6EF4\u7684\u7B1B\u9069\u93D1\u6EBA\u54F2\u5FB9\u64A4\u8F4D\u8FED\u9244\u5178\u586B\u5929\u5C55\u5E97\u6DFB\u7E8F\u751C\u8CBC\u8EE2\u985B\u70B9\u4F1D\u6BBF\u6FB1\u7530\u96FB\u514E\u5410\u5835\u5857\u59AC\u5C60\u5F92\u6597\u675C\u6E21\u767B\u83DF\u8CED\u9014\u90FD\u934D\u7825\u783A\u52AA\u5EA6\u571F\u5974\u6012\u5012\u515A\u51AC\u51CD\u5200\u5510\u5854\u5858\u5957\u5B95\u5CF6\u5D8B\u60BC\u6295\u642D\u6771\u6843\u68BC\u68DF\u76D7\u6DD8\u6E6F\u6D9B\u706F\u71C8\u5F53\u75D8\u7977\u7B49\u7B54\u7B52\u7CD6\u7D71\u5230\u8463\u8569\u85E4\u8A0E\u8B04\u8C46\u8E0F\u9003\u900F\u9419\u9676\u982D\u9A30\u95D8\u50CD\u52D5\u540C\u5802\u5C0E\u61A7\u649E\u6D1E\u77B3\u7AE5\u80F4\u8404\u9053\u9285\u5CE0\u9D07\u533F\u5F97\u5FB3\u6D9C\u7279\u7763\u79BF\u7BE4\u6BD2\u72EC\u8AAD\u6803\u6A61\u51F8\u7A81\u6934\u5C4A\u9CF6\u82EB\u5BC5\u9149\u701E\u5678\u5C6F\u60C7\u6566\u6C8C\u8C5A\u9041\u9813\u5451\u66C7\u920D\u5948\u90A3\u5185\u4E4D\u51EA\u8599\u8B0E\u7058\u637A\u934B\u6962\u99B4\u7E04\u7577\u5357\u6960\u8EDF\u96E3\u6C5D\u4E8C\u5C3C\u5F10\u8FE9\u5302\u8CD1\u8089\u8679\u5EFF\u65E5\u4E73\u5165\u5982\u5C3F\u97EE\u4EFB\u598A\u5FCD\u8A8D\u6FE1\u79B0\u7962\u5BE7\u8471\u732B\u71B1\u5E74\u5FF5\u637B\u649A\u71C3\u7C98\u4E43\u5EFC\u4E4B\u57DC\u56A2\u60A9\u6FC3\u7D0D\u80FD\u8133\u81BF\u8FB2\u8997\u86A4\u5DF4\u628A\u64AD\u8987\u6777\u6CE2\u6D3E\u7436\u7834\u5A46\u7F75\u82AD\u99AC\u4FF3\u5EC3\u62DD\u6392\u6557\u676F\u76C3\u724C\u80CC\u80BA\u8F29\u914D\u500D\u57F9\u5A92\u6885\u6973\u7164\u72FD\u8CB7\u58F2\u8CE0\u966A\u9019\u877F\u79E4\u77E7\u8429\u4F2F\u5265\u535A\u62CD\u67CF\u6CCA\u767D\u7B94\u7C95\u8236\u8584\u8FEB\u66DD\u6F20\u7206\u7E1B\u83AB\u99C1\u9EA6\u51FD\u7BB1\u7872\u7BB8\u8087\u7B48\u6AE8\u5E61\u808C\u7551\u7560\u516B\u9262\u6E8C\u767A\u9197\u9AEA\u4F10\u7F70\u629C\u7B4F\u95A5\u9CE9\u567A\u5859\u86E4\u96BC\u4F34\u5224\u534A\u53CD\u53DB\u5E06\u642C\u6591\u677F\u6C3E\u6C4E\u7248\u72AF\u73ED\u7554\u7E41\u822C\u85E9\u8CA9\u7BC4\u91C6\u7169\u9812\u98EF\u633D\u6669\u756A\u76E4\u78D0\u8543\u86EE\u532A\u5351\u5426\u5983\u5E87\u5F7C\u60B2\u6249\u6279\u62AB\u6590\u6BD4\u6CCC\u75B2\u76AE\u7891\u79D8\u7DCB\u7F77\u80A5\u88AB\u8AB9\u8CBB\u907F\u975E\u98DB\u6A0B\u7C38\u5099\u5C3E\u5FAE\u6787\u6BD8\u7435\u7709\u7F8E\u9F3B\u67CA\u7A17\u5339\u758B\u9AED\u5F66\u819D\u83F1\u8098\u5F3C\u5FC5\u7562\u7B46\u903C\u6867\u59EB\u5A9B\u7D10\u767E\u8B2C\u4FF5\u5F6A\u6A19\u6C37\u6F02\u74E2\u7968\u8868\u8A55\u8C79\u5EDF\u63CF\u75C5\u79D2\u82D7\u9328\u92F2\u849C\u86ED\u9C2D\u54C1\u5F6C\u658C\u6D5C\u7015\u8CA7\u8CD3\u983B\u654F\u74F6\u4E0D\u4ED8\u57E0\u592B\u5A66\u5BCC\u51A8\u5E03\u5E9C\u6016\u6276\u6577\u65A7\u666E\u6D6E\u7236\u7B26\u8150\u819A\u8299\u8B5C\u8CA0\u8CE6\u8D74\u961C\u9644\u4FAE\u64AB\u6B66\u821E\u8461\u856A\u90E8\u5C01\u6953\u98A8\u847A\u8557\u4F0F\u526F\u5FA9\u5E45\u670D\u798F\u8179\u8907\u8986\u6DF5\u5F17\u6255\u6CB8\u4ECF\u7269\u9B92\u5206\u543B\u5674\u58B3\u61A4\u626E\u711A\u596E\u7C89\u7CDE\u7D1B\u96F0\u6587\u805E\u4E19\u4F75\u5175\u5840\u5E63\u5E73\u5F0A\u67C4\u4E26\u853D\u9589\u965B\u7C73\u9801\u50FB\u58C1\u7656\u78A7\u5225\u77A5\u8511\u7B86\u504F\u5909\u7247\u7BC7\u7DE8\u8FBA\u8FD4\u904D\u4FBF\u52C9\u5A29\u5F01\u97AD\u4FDD\u8217\u92EA\u5703\u6355\u6B69\u752B\u88DC\u8F14\u7A42\u52DF\u5893\u6155\u620A\u66AE\u6BCD\u7C3F\u83E9\u5023\u4FF8\u5305\u5446\u5831\u5949\u5B9D\u5CF0\u5CEF\u5D29\u5E96\u62B1\u6367\u653E\u65B9\u670B\u6CD5\u6CE1\u70F9\u7832\u7E2B\u80DE\u82B3\u840C\u84EC\u8702\u8912\u8A2A\u8C4A\u90A6\u92D2\u98FD\u9CF3\u9D6C\u4E4F\u4EA1\u508D\u5256\u574A\u59A8\u5E3D\u5FD8\u5FD9\u623F\u66B4\u671B\u67D0\u68D2\u5192\u7D21\u80AA\u81A8\u8B00\u8C8C\u8CBF\u927E\u9632\u5420\u982C\u5317\u50D5\u535C\u58A8\u64B2\u6734\u7267\u7766\u7A46\u91E6\u52C3\u6CA1\u6B86\u5800\u5E4C\u5954\u672C\u7FFB\u51E1\u76C6\u6469\u78E8\u9B54\u9EBB\u57CB\u59B9\u6627\u679A\u6BCE\u54E9\u69D9\u5E55\u819C\u6795\u9BAA\u67FE\u9C52\u685D\u4EA6\u4FE3\u53C8\u62B9\u672B\u6CAB\u8FC4\u4FAD\u7E6D\u9EBF\u4E07\u6162\u6E80\u6F2B\u8513\u5473\u672A\u9B45\u5DF3\u7B95\u5CAC\u5BC6\u871C\u6E4A\u84D1\u7A14\u8108\u5999\u7C8D\u6C11\u7720\u52D9\u5922\u7121\u725F\u77DB\u9727\u9D61\u690B\u5A7F\u5A18\u51A5\u540D\u547D\u660E\u76DF\u8FF7\u9298\u9CF4\u59EA\u725D\u6EC5\u514D\u68C9\u7DBF\u7DEC\u9762\u9EBA\u6478\u6A21\u8302\u5984\u5B5F\u6BDB\u731B\u76F2\u7DB2\u8017\u8499\u5132\u6728\u9ED9\u76EE\u6762\u52FF\u9905\u5C24\u623B\u7C7E\u8CB0\u554F\u60B6\u7D0B\u9580\u5301\u4E5F\u51B6\u591C\u723A\u8036\u91CE\u5F25\u77E2\u5384\u5F79\u7D04\u85AC\u8A33\u8E8D\u9756\u67F3\u85AE\u9453\u6109\u6108\u6CB9\u7652\u8AED\u8F38\u552F\u4F51\u512A\u52C7\u53CB\u5BA5\u5E7D\u60A0\u6182\u63D6\u6709\u67DA\u6E67\u6D8C\u7336\u7337\u7531\u7950\u88D5\u8A98\u904A\u9091\u90F5\u96C4\u878D\u5915\u4E88\u4F59\u4E0E\u8A89\u8F3F\u9810\u50AD\u5E7C\u5996\u5BB9\u5EB8\u63DA\u63FA\u64C1\u66DC\u694A\u69D8\u6D0B\u6EB6\u7194\u7528\u7AAF\u7F8A\u8000\u8449\u84C9\u8981\u8B21\u8E0A\u9065\u967D\u990A\u617E\u6291\u6B32\u6C83\u6D74\u7FCC\u7FFC\u6DC0\u7F85\u87BA\u88F8\u6765\u83B1\u983C\u96F7\u6D1B\u7D61\u843D\u916A\u4E71\u5375\u5D50\u6B04\u6FEB\u85CD\u862D\u89A7\u5229\u540F\u5C65\u674E\u68A8\u7406\u7483\u75E2\u88CF\u88E1\u91CC\u96E2\u9678\u5F8B\u7387\u7ACB\u844E\u63A0\u7565\u5289\u6D41\u6E9C\u7409\u7559\u786B\u7C92\u9686\u7ADC\u9F8D\u4FB6\u616E\u65C5\u865C\u4E86\u4EAE\u50DA\u4E21\u51CC\u5BEE\u6599\u6881\u6DBC\u731F\u7642\u77AD\u7A1C\u7CE7\u826F\u8AD2\u907C\u91CF\u9675\u9818\u529B\u7DD1\u502B\u5398\u6797\u6DCB\u71D0\u7433\u81E8\u8F2A\u96A3\u9C57\u9E9F\u7460\u5841\u6D99\u7D2F\u985E\u4EE4\u4F36\u4F8B\u51B7\u52B1\u5DBA\u601C\u73B2\u793C\u82D3\u9234\u96B7\u96F6\u970A\u9E97\u9F62\u66A6\u6B74\u5217\u52A3\u70C8\u88C2\u5EC9\u604B\u6190\u6F23\u7149\u7C3E\u7DF4\u806F\u84EE\u9023\u932C\u5442\u9B6F\u6AD3\u7089\u8CC2\u8DEF\u9732\u52B4\u5A41\u5ECA\u5F04\u6717\u697C\u6994\u6D6A\u6F0F\u7262\u72FC\u7BED\u8001\u807E\u874B\u90CE\u516D\u9E93\u7984\u808B\u9332\u8AD6\u502D\u548C\u8A71\u6B6A\u8CC4\u8107\u60D1\u67A0\u9DF2\u4E99\u4E98\u9C10\u8A6B\u85C1\u8568\u6900\u6E7E\u7897\u8155\u5F0C\u4E10\u4E15\u4E2A\u4E31\u4E36\u4E3C\u4E3F\u4E42\u4E56\u4E58\u4E82\u4E85\u8C6B\u4E8A\u8212\u5F0D\u4E8E\u4E9E\u4E9F\u4EA0\u4EA2\u4EB0\u4EB3\u4EB6\u4ECE\u4ECD\u4EC4\u4EC6\u4EC2\u4ED7\u4EDE\u4EED\u4EDF\u4EF7\u4F09\u4F5A\u4F30\u4F5B\u4F5D\u4F57\u4F47\u4F76\u4F88\u4F8F\u4F98\u4F7B\u4F69\u4F70\u4F91\u4F6F\u4F86\u4F96\u5118\u4FD4\u4FDF\u4FCE\u4FD8\u4FDB\u4FD1\u4FDA\u4FD0\u4FE4\u4FE5\u501A\u5028\u5014\u502A\u5025\u5005\u4F1C\u4FF6\u5021\u5029\u502C\u4FFE\u4FEF\u5011\u5006\u5043\u5047\u6703\u5055\u5050\u5048\u505A\u5056\u506C\u5078\u5080\u509A\u5085\u50B4\u50B2\u50C9\u50CA\u50B3\u50C2\u50D6\u50DE\u50E5\u50ED\u50E3\u50EE\u50F9\u50F5\u5109\u5101\u5102\u5116\u5115\u5114\u511A\u5121\u513A\u5137\u513C\u513B\u513F\u5140\u5152\u514C\u5154\u5162\u7AF8\u5169\u516A\u516E\u5180\u5182\u56D8\u518C\u5189\u518F\u5191\u5193\u5195\u5196\u51A4\u51A6\u51A2\u51A9\u51AA\u51AB\u51B3\u51B1\u51B2\u51B0\u51B5\u51BD\u51C5\u51C9\u51DB\u51E0\u8655\u51E9\u51ED\u51F0\u51F5\u51FE\u5204\u520B\u5214\u520E\u5227\u522A\u522E\u5233\u5239\u524F\u5244\u524B\u524C\u525E\u5254\u526A\u5274\u5269\u5273\u527F\u527D\u528D\u5294\u5292\u5271\u5288\u5291\u8FA8\u8FA7\u52AC\u52AD\u52BC\u52B5\u52C1\u52CD\u52D7\u52DE\u52E3\u52E6\u98ED\u52E0\u52F3\u52F5\u52F8\u52F9\u5306\u5308\u7538\u530D\u5310\u530F\u5315\u531A\u5323\u532F\u5331\u5333\u5338\u5340\u5346\u5345\u4E17\u5349\u534D\u51D6\u535E\u5369\u536E\u5918\u537B\u5377\u5382\u5396\u53A0\u53A6\u53A5\u53AE\u53B0\u53B6\u53C3\u7C12\u96D9\u53DF\u66FC\u71EE\u53EE\u53E8\u53ED\u53FA\u5401\u543D\u5440\u542C\u542D\u543C\u542E\u5436\u5429\u541D\u544E\u548F\u5475\u548E\u545F\u5471\u5477\u5470\u5492\u547B\u5480\u5476\u5484\u5490\u5486\u54C7\u54A2\u54B8\u54A5\u54AC\u54C4\u54C8\u54A8\u54AB\u54C2\u54A4\u54BE\u54BC\u54D8\u54E5\u54E6\u550F\u5514\u54FD\u54EE\u54ED\u54FA\u54E2\u5539\u5540\u5563\u554C\u552E\u555C\u5545\u5556\u5557\u5538\u5533\u555D\u5599\u5580\u54AF\u558A\u559F\u557B\u557E\u5598\u559E\u55AE\u557C\u5583\u55A9\u5587\u55A8\u55DA\u55C5\u55DF\u55C4\u55DC\u55E4\u55D4\u5614\u55F7\u5616\u55FE\u55FD\u561B\u55F9\u564E\u5650\u71DF\u5634\u5636\u5632\u5638\u566B\u5664\u562F\u566C\u566A\u5686\u5680\u568A\u56A0\u5694\u568F\u56A5\u56AE\u56B6\u56B4\u56C2\u56BC\u56C1\u56C3\u56C0\u56C8\u56CE\u56D1\u56D3\u56D7\u56EE\u56F9\u5700\u56FF\u5704\u5709\u5708\u570B\u570D\u5713\u5718\u5716\u55C7\u571C\u5726\u5737\u5738\u574E\u573B\u5740\u574F\u5769\u57C0\u5788\u5761\u577F\u5789\u5793\u57A0\u57B3\u57A4\u57AA\u57B0\u57C3\u57C6\u57D4\u57D2\u57D3\u580A\u57D6\u57E3\u580B\u5819\u581D\u5872\u5821\u5862\u584B\u5870\u6BC0\u5852\u583D\u5879\u5885\u58B9\u589F\u58AB\u58BA\u58DE\u58BB\u58B8\u58AE\u58C5\u58D3\u58D1\u58D7\u58D9\u58D8\u58E5\u58DC\u58E4\u58DF\u58EF\u58FA\u58F9\u58FB\u58FC\u58FD\u5902\u590A\u5910\u591B\u68A6\u5925\u592C\u592D\u5932\u5938\u593E\u7AD2\u5955\u5950\u594E\u595A\u5958\u5962\u5960\u5967\u596C\u5969\u5978\u5981\u599D\u4F5E\u4FAB\u59A3\u59B2\u59C6\u59E8\u59DC\u598D\u59D9\u59DA\u5A25\u5A1F\u5A11\u5A1C\u5A09\u5A1A\u5A40\u5A6C\u5A49\u5A35\u5A36\u5A62\u5A6A\u5A9A\u5ABC\u5ABE\u5ACB\u5AC2\u5ABD\u5AE3\u5AD7\u5AE6\u5AE9\u5AD6\u5AFA\u5AFB\u5B0C\u5B0B\u5B16\u5B32\u5AD0\u5B2A\u5B36\u5B3E\u5B43\u5B45\u5B40\u5B51\u5B55\u5B5A\u5B5B\u5B65\u5B69\u5B70\u5B73\u5B75\u5B78\u6588\u5B7A\u5B80\u5B83\u5BA6\u5BB8\u5BC3\u5BC7\u5BC9\u5BD4\u5BD0\u5BE4\u5BE6\u5BE2\u5BDE\u5BE5\u5BEB\u5BF0\u5BF6\u5BF3\u5C05\u5C07\u5C08\u5C0D\u5C13\u5C20\u5C22\u5C28\u5C38\u5C39\u5C41\u5C46\u5C4E\u5C53\u5C50\u5C4F\u5B71\u5C6C\u5C6E\u4E62\u5C76\u5C79\u5C8C\u5C91\u5C94\u599B\u5CAB\u5CBB\u5CB6\u5CBC\u5CB7\u5CC5\u5CBE\u5CC7\u5CD9\u5CE9\u5CFD\u5CFA\u5CED\u5D8C\u5CEA\u5D0B\u5D15\u5D17\u5D5C\u5D1F\u5D1B\u5D11\u5D14\u5D22\u5D1A\u5D19\u5D18\u5D4C\u5D52\u5D4E\u5D4B\u5D6C\u5D73\u5D76\u5D87\u5D84\u5D82\u5DA2\u5D9D\u5DAC\u5DAE\u5DBD\u5D90\u5DB7\u5DBC\u5DC9\u5DCD\u5DD3\u5DD2\u5DD6\u5DDB\u5DEB\u5DF2\u5DF5\u5E0B\u5E1A\u5E19\u5E11\u5E1B\u5E36\u5E37\u5E44\u5E43\u5E40\u5E4E\u5E57\u5E54\u5E5F\u5E62\u5E64\u5E47\u5E75\u5E76\u5E7A\u9EBC\u5E7F\u5EA0\u5EC1\u5EC2\u5EC8\u5ED0\u5ECF\u5ED6\u5EE3\u5EDD\u5EDA\u5EDB\u5EE2\u5EE1\u5EE8\u5EE9\u5EEC\u5EF1\u5EF3\u5EF0\u5EF4\u5EF8\u5EFE\u5F03\u5F09\u5F5D\u5F5C\u5F0B\u5F11\u5F16\u5F29\u5F2D\u5F38\u5F41\u5F48\u5F4C\u5F4E\u5F2F\u5F51\u5F56\u5F57\u5F59\u5F61\u5F6D\u5F73\u5F77\u5F83\u5F82\u5F7F\u5F8A\u5F88\u5F91\u5F87\u5F9E\u5F99\u5F98\u5FA0\u5FA8\u5FAD\u5FBC\u5FD6\u5FFB\u5FE4\u5FF8\u5FF1\u5FDD\u60B3\u5FFF\u6021\u6060\u6019\u6010\u6029\u600E\u6031\u601B\u6015\u602B\u6026\u600F\u603A\u605A\u6041\u606A\u6077\u605F\u604A\u6046\u604D\u6063\u6043\u6064\u6042\u606C\u606B\u6059\u6081\u608D\u60E7\u6083\u609A\u6084\u609B\u6096\u6097\u6092\u60A7\u608B\u60E1\u60B8\u60E0\u60D3\u60B4\u5FF0\u60BD\u60C6\u60B5\u60D8\u614D\u6115\u6106\u60F6\u60F7\u6100\u60F4\u60FA\u6103\u6121\u60FB\u60F1\u610D\u610E\u6147\u613E\u6128\u6127\u614A\u613F\u613C\u612C\u6134\u613D\u6142\u6144\u6173\u6177\u6158\u6159\u615A\u616B\u6174\u616F\u6165\u6171\u615F\u615D\u6153\u6175\u6199\u6196\u6187\u61AC\u6194\u619A\u618A\u6191\u61AB\u61AE\u61CC\u61CA\u61C9\u61F7\u61C8\u61C3\u61C6\u61BA\u61CB\u7F79\u61CD\u61E6\u61E3\u61F6\u61FA\u61F4\u61FF\u61FD\u61FC\u61FE\u6200\u6208\u6209\u620D\u620C\u6214\u621B\u621E\u6221\u622A\u622E\u6230\u6232\u6233\u6241\u624E\u625E\u6263\u625B\u6260\u6268\u627C\u6282\u6289\u627E\u6292\u6293\u6296\u62D4\u6283\u6294\u62D7\u62D1\u62BB\u62CF\u62FF\u62C6\u64D4\u62C8\u62DC\u62CC\u62CA\u62C2\u62C7\u629B\u62C9\u630C\u62EE\u62F1\u6327\u6302\u6308\u62EF\u62F5\u6350\u633E\u634D\u641C\u634F\u6396\u638E\u6380\u63AB\u6376\u63A3\u638F\u6389\u639F\u63B5\u636B\u6369\u63BE\u63E9\u63C0\u63C6\u63E3\u63C9\u63D2\u63F6\u63C4\u6416\u6434\u6406\u6413\u6426\u6436\u651D\u6417\u6428\u640F\u6467\u646F\u6476\u644E\u652A\u6495\u6493\u64A5\u64A9\u6488\u64BC\u64DA\u64D2\u64C5\u64C7\u64BB\u64D8\u64C2\u64F1\u64E7\u8209\u64E0\u64E1\u62AC\u64E3\u64EF\u652C\u64F6\u64F4\u64F2\u64FA\u6500\u64FD\u6518\u651C\u6505\u6524\u6523\u652B\u6534\u6535\u6537\u6536\u6538\u754B\u6548\u6556\u6555\u654D\u6558\u655E\u655D\u6572\u6578\u6582\u6583\u8B8A\u659B\u659F\u65AB\u65B7\u65C3\u65C6\u65C1\u65C4\u65CC\u65D2\u65DB\u65D9\u65E0\u65E1\u65F1\u6772\u660A\u6603\u65FB\u6773\u6635\u6636\u6634\u661C\u664F\u6644\u6649\u6641\u665E\u665D\u6664\u6667\u6668\u665F\u6662\u6670\u6683\u6688\u668E\u6689\u6684\u6698\u669D\u66C1\u66B9\u66C9\u66BE\u66BC\u66C4\u66B8\u66D6\u66DA\u66E0\u663F\u66E6\u66E9\u66F0\u66F5\u66F7\u670F\u6716\u671E\u6726\u6727\u9738\u672E\u673F\u6736\u6741\u6738\u6737\u6746\u675E\u6760\u6759\u6763\u6764\u6789\u6770\u67A9\u677C\u676A\u678C\u678B\u67A6\u67A1\u6785\u67B7\u67EF\u67B4\u67EC\u67B3\u67E9\u67B8\u67E4\u67DE\u67DD\u67E2\u67EE\u67B9\u67CE\u67C6\u67E7\u6A9C\u681E\u6846\u6829\u6840\u684D\u6832\u684E\u68B3\u682B\u6859\u6863\u6877\u687F\u689F\u688F\u68AD\u6894\u689D\u689B\u6883\u6AAE\u68B9\u6874\u68B5\u68A0\u68BA\u690F\u688D\u687E\u6901\u68CA\u6908\u68D8\u6922\u6926\u68E1\u690C\u68CD\u68D4\u68E7\u68D5\u6936\u6912\u6904\u68D7\u68E3\u6925\u68F9\u68E0\u68EF\u6928\u692A\u691A\u6923\u6921\u68C6\u6979\u6977\u695C\u6978\u696B\u6954\u697E\u696E\u6939\u6974\u693D\u6959\u6930\u6961\u695E\u695D\u6981\u696A\u69B2\u69AE\u69D0\u69BF\u69C1\u69D3\u69BE\u69CE\u5BE8\u69CA\u69DD\u69BB\u69C3\u69A7\u6A2E\u6991\u69A0\u699C\u6995\u69B4\u69DE\u69E8\u6A02\u6A1B\u69FF\u6B0A\u69F9\u69F2\u69E7\u6A05\u69B1\u6A1E\u69ED\u6A14\u69EB\u6A0A\u6A12\u6AC1\u6A23\u6A13\u6A44\u6A0C\u6A72\u6A36\u6A78\u6A47\u6A62\u6A59\u6A66\u6A48\u6A38\u6A22\u6A90\u6A8D\u6AA0\u6A84\u6AA2\u6AA3\u6A97\u8617\u6ABB\u6AC3\u6AC2\u6AB8\u6AB3\u6AAC\u6ADE\u6AD1\u6ADF\u6AAA\u6ADA\u6AEA\u6AFB\u6B05\u8616\u6AFA\u6B12\u6B16\u9B31\u6B1F\u6B38\u6B37\u76DC\u6B39\u98EE\u6B47\u6B43\u6B49\u6B50\u6B59\u6B54\u6B5B\u6B5F\u6B61\u6B78\u6B79\u6B7F\u6B80\u6B84\u6B83\u6B8D\u6B98\u6B95\u6B9E\u6BA4\u6BAA\u6BAB\u6BAF\u6BB2\u6BB1\u6BB3\u6BB7\u6BBC\u6BC6\u6BCB\u6BD3\u6BDF\u6BEC\u6BEB\u6BF3\u6BEF\u9EBE\u6C08\u6C13\u6C14\u6C1B\u6C24\u6C23\u6C5E\u6C55\u6C62\u6C6A\u6C82\u6C8D\u6C9A\u6C81\u6C9B\u6C7E\u6C68\u6C73\u6C92\u6C90\u6CC4\u6CF1\u6CD3\u6CBD\u6CD7\u6CC5\u6CDD\u6CAE\u6CB1\u6CBE\u6CBA\u6CDB\u6CEF\u6CD9\u6CEA\u6D1F\u884D\u6D36\u6D2B\u6D3D\u6D38\u6D19\u6D35\u6D33\u6D12\u6D0C\u6D63\u6D93\u6D64\u6D5A\u6D79\u6D59\u6D8E\u6D95\u6FE4\u6D85\u6DF9\u6E15\u6E0A\u6DB5\u6DC7\u6DE6\u6DB8\u6DC6\u6DEC\u6DDE\u6DCC\u6DE8\u6DD2\u6DC5\u6DFA\u6DD9\u6DE4\u6DD5\u6DEA\u6DEE\u6E2D\u6E6E\u6E2E\u6E19\u6E72\u6E5F\u6E3E\u6E23\u6E6B\u6E2B\u6E76\u6E4D\u6E1F\u6E43\u6E3A\u6E4E\u6E24\u6EFF\u6E1D\u6E38\u6E82\u6EAA\u6E98\u6EC9\u6EB7\u6ED3\u6EBD\u6EAF\u6EC4\u6EB2\u6ED4\u6ED5\u6E8F\u6EA5\u6EC2\u6E9F\u6F41\u6F11\u704C\u6EEC\u6EF8\u6EFE\u6F3F\u6EF2\u6F31\u6EEF\u6F32\u6ECC\u6F3E\u6F13\u6EF7\u6F86\u6F7A\u6F78\u6F81\u6F80\u6F6F\u6F5B\u6FF3\u6F6D\u6F82\u6F7C\u6F58\u6F8E\u6F91\u6FC2\u6F66\u6FB3\u6FA3\u6FA1\u6FA4\u6FB9\u6FC6\u6FAA\u6FDF\u6FD5\u6FEC\u6FD4\u6FD8\u6FF1\u6FEE\u6FDB\u7009\u700B\u6FFA\u7011\u7001\u700F\u6FFE\u701B\u701A\u6F74\u701D\u7018\u701F\u7030\u703E\u7032\u7051\u7063\u7099\u7092\u70AF\u70F1\u70AC\u70B8\u70B3\u70AE\u70DF\u70CB\u70DD\u70D9\u7109\u70FD\u711C\u7119\u7165\u7155\u7188\u7166\u7162\u714C\u7156\u716C\u718F\u71FB\u7184\u7195\u71A8\u71AC\u71D7\u71B9\u71BE\u71D2\u71C9\u71D4\u71CE\u71E0\u71EC\u71E7\u71F5\u71FC\u71F9\u71FF\u720D\u7210\u721B\u7228\u722D\u722C\u7230\u7232\u723B\u723C\u723F\u7240\u7246\u724B\u7258\u7274\u727E\u7282\u7281\u7287\u7292\u7296\u72A2\u72A7\u72B9\u72B2\u72C3\u72C6\u72C4\u72CE\u72D2\u72E2\u72E0\u72E1\u72F9\u72F7\u500F\u7317\u730A\u731C\u7316\u731D\u7334\u732F\u7329\u7325\u733E\u734E\u734F\u9ED8\u7357\u736A\u7368\u7370\u7378\u7375\u737B\u737A\u73C8\u73B3\u73CE\u73BB\u73C0\u73E5\u73EE\u73DE\u74A2\u7405\u746F\u7425\u73F8\u7432\u743A\u7455\u743F\u745F\u7459\u7441\u745C\u7469\u7470\u7463\u746A\u7476\u747E\u748B\u749E\u74A7\u74CA\u74CF\u74D4\u73F1\u74E0\u74E3\u74E7\u74E9\u74EE\u74F2\u74F0\u74F1\u74F8\u74F7\u7504\u7503\u7505\u750C\u750E\u750D\u7515\u7513\u751E\u7526\u752C\u753C\u7544\u754D\u754A\u7549\u755B\u7546\u755A\u7569\u7564\u7567\u756B\u756D\u7578\u7576\u7586\u7587\u7574\u758A\u7589\u7582\u7594\u759A\u759D\u75A5\u75A3\u75C2\u75B3\u75C3\u75B5\u75BD\u75B8\u75BC\u75B1\u75CD\u75CA\u75D2\u75D9\u75E3\u75DE\u75FE\u75FF\u75FC\u7601\u75F0\u75FA\u75F2\u75F3\u760B\u760D\u7609\u761F\u7627\u7620\u7621\u7622\u7624\u7634\u7630\u763B\u7647\u7648\u7646\u765C\u7658\u7661\u7662\u7668\u7669\u766A\u7667\u766C\u7670\u7672\u7676\u7678\u767C\u7680\u7683\u7688\u768B\u768E\u7696\u7693\u7699\u769A\u76B0\u76B4\u76B8\u76B9\u76BA\u76C2\u76CD\u76D6\u76D2\u76DE\u76E1\u76E5\u76E7\u76EA\u862F\u76FB\u7708\u7707\u7704\u7729\u7724\u771E\u7725\u7726\u771B\u7737\u7738\u7747\u775A\u7768\u776B\u775B\u7765\u777F\u777E\u7779\u778E\u778B\u7791\u77A0\u779E\u77B0\u77B6\u77B9\u77BF\u77BC\u77BD\u77BB\u77C7\u77CD\u77D7\u77DA\u77DC\u77E3\u77EE\u77FC\u780C\u7812\u7926\u7820\u792A\u7845\u788E\u7874\u7886\u787C\u789A\u788C\u78A3\u78B5\u78AA\u78AF\u78D1\u78C6\u78CB\u78D4\u78BE\u78BC\u78C5\u78CA\u78EC\u78E7\u78DA\u78FD\u78F4\u7907\u7912\u7911\u7919\u792C\u792B\u7940\u7960\u7957\u795F\u795A\u7955\u7953\u797A\u797F\u798A\u799D\u79A7\u9F4B\u79AA\u79AE\u79B3\u79B9\u79BA\u79C9\u79D5\u79E7\u79EC\u79E1\u79E3\u7A08\u7A0D\u7A18\u7A19\u7A20\u7A1F\u7980\u7A31\u7A3B\u7A3E\u7A37\u7A43\u7A57\u7A49\u7A61\u7A62\u7A69\u9F9D\u7A70\u7A79\u7A7D\u7A88\u7A97\u7A95\u7A98\u7A96\u7AA9\u7AC8\u7AB0\u7AB6\u7AC5\u7AC4\u7ABF\u9083\u7AC7\u7ACA\u7ACD\u7ACF\u7AD5\u7AD3\u7AD9\u7ADA\u7ADD\u7AE1\u7AE2\u7AE6\u7AED\u7AF0\u7B02\u7B0F\u7B0A\u7B06\u7B33\u7B18\u7B19\u7B1E\u7B35\u7B28\u7B36\u7B50\u7B7A\u7B04\u7B4D\u7B0B\u7B4C\u7B45\u7B75\u7B65\u7B74\u7B67\u7B70\u7B71\u7B6C\u7B6E\u7B9D\u7B98\u7B9F\u7B8D\u7B9C\u7B9A\u7B8B\u7B92\u7B8F\u7B5D\u7B99\u7BCB\u7BC1\u7BCC\u7BCF\u7BB4\u7BC6\u7BDD\u7BE9\u7C11\u7C14\u7BE6\u7BE5\u7C60\u7C00\u7C07\u7C13\u7BF3\u7BF7\u7C17\u7C0D\u7BF6\u7C23\u7C27\u7C2A\u7C1F\u7C37\u7C2B\u7C3D\u7C4C\u7C43\u7C54\u7C4F\u7C40\u7C50\u7C58\u7C5F\u7C64\u7C56\u7C65\u7C6C\u7C75\u7C83\u7C90\u7CA4\u7CAD\u7CA2\u7CAB\u7CA1\u7CA8\u7CB3\u7CB2\u7CB1\u7CAE\u7CB9\u7CBD\u7CC0\u7CC5\u7CC2\u7CD8\u7CD2\u7CDC\u7CE2\u9B3B\u7CEF\u7CF2\u7CF4\u7CF6\u7CFA\u7D06\u7D02\u7D1C\u7D15\u7D0A\u7D45\u7D4B\u7D2E\u7D32\u7D3F\u7D35\u7D46\u7D73\u7D56\u7D4E\u7D72\u7D68\u7D6E\u7D4F\u7D63\u7D93\u7D89\u7D5B\u7D8F\u7D7D\u7D9B\u7DBA\u7DAE\u7DA3\u7DB5\u7DC7\u7DBD\u7DAB\u7E3D\u7DA2\u7DAF\u7DDC\u7DB8\u7D9F\u7DB0\u7DD8\u7DDD\u7DE4\u7DDE\u7DFB\u7DF2\u7DE1\u7E05\u7E0A\u7E23\u7E21\u7E12\u7E31\u7E1F\u7E09\u7E0B\u7E22\u7E46\u7E66\u7E3B\u7E35\u7E39\u7E43\u7E37\u7E32\u7E3A\u7E67\u7E5D\u7E56\u7E5E\u7E59\u7E5A\u7E79\u7E6A\u7E69\u7E7C\u7E7B\u7E83\u7DD5\u7E7D\u8FAE\u7E7F\u7E88\u7E89\u7E8C\u7E92\u7E90\u7E93\u7E94\u7E96\u7E8E\u7E9B\u7E9C\u7F38\u7F3A\u7F45\u7F4C\u7F4D\u7F4E\u7F50\u7F51\u7F55\u7F54\u7F58\u7F5F\u7F60\u7F68\u7F69\u7F67\u7F78\u7F82\u7F86\u7F83\u7F88\u7F87\u7F8C\u7F94\u7F9E\u7F9D\u7F9A\u7FA3\u7FAF\u7FB2\u7FB9\u7FAE\u7FB6\u7FB8\u8B71\u7FC5\u7FC6\u7FCA\u7FD5\u7FD4\u7FE1\u7FE6\u7FE9\u7FF3\u7FF9\u98DC\u8006\u8004\u800B\u8012\u8018\u8019\u801C\u8021\u8028\u803F\u803B\u804A\u8046\u8052\u8058\u805A\u805F\u8062\u8068\u8073\u8072\u8070\u8076\u8079\u807D\u807F\u8084\u8086\u8085\u809B\u8093\u809A\u80AD\u5190\u80AC\u80DB\u80E5\u80D9\u80DD\u80C4\u80DA\u80D6\u8109\u80EF\u80F1\u811B\u8129\u8123\u812F\u814B\u968B\u8146\u813E\u8153\u8151\u80FC\u8171\u816E\u8165\u8166\u8174\u8183\u8188\u818A\u8180\u8182\u81A0\u8195\u81A4\u81A3\u815F\u8193\u81A9\u81B0\u81B5\u81BE\u81B8\u81BD\u81C0\u81C2\u81BA\u81C9\u81CD\u81D1\u81D9\u81D8\u81C8\u81DA\u81DF\u81E0\u81E7\u81FA\u81FB\u81FE\u8201\u8202\u8205\u8207\u820A\u820D\u8210\u8216\u8229\u822B\u8238\u8233\u8240\u8259\u8258\u825D\u825A\u825F\u8264\u8262\u8268\u826A\u826B\u822E\u8271\u8277\u8278\u827E\u828D\u8292\u82AB\u829F\u82BB\u82AC\u82E1\u82E3\u82DF\u82D2\u82F4\u82F3\u82FA\u8393\u8303\u82FB\u82F9\u82DE\u8306\u82DC\u8309\u82D9\u8335\u8334\u8316\u8332\u8331\u8340\u8339\u8350\u8345\u832F\u832B\u8317\u8318\u8385\u839A\u83AA\u839F\u83A2\u8396\u8323\u838E\u8387\u838A\u837C\u83B5\u8373\u8375\u83A0\u8389\u83A8\u83F4\u8413\u83EB\u83CE\u83FD\u8403\u83D8\u840B\u83C1\u83F7\u8407\u83E0\u83F2\u840D\u8422\u8420\u83BD\u8438\u8506\u83FB\u846D\u842A\u843C\u855A\u8484\u8477\u846B\u84AD\u846E\u8482\u8469\u8446\u842C\u846F\u8479\u8435\u84CA\u8462\u84B9\u84BF\u849F\u84D9\u84CD\u84BB\u84DA\u84D0\u84C1\u84C6\u84D6\u84A1\u8521\u84FF\u84F4\u8517\u8518\u852C\u851F\u8515\u8514\u84FC\u8540\u8563\u8558\u8548\u8541\u8602\u854B\u8555\u8580\u85A4\u8588\u8591\u858A\u85A8\u856D\u8594\u859B\u85EA\u8587\u859C\u8577\u857E\u8590\u85C9\u85BA\u85CF\u85B9\u85D0\u85D5\u85DD\u85E5\u85DC\u85F9\u860A\u8613\u860B\u85FE\u85FA\u8606\u8622\u861A\u8630\u863F\u864D\u4E55\u8654\u865F\u8667\u8671\u8693\u86A3\u86A9\u86AA\u868B\u868C\u86B6\u86AF\u86C4\u86C6\u86B0\u86C9\u8823\u86AB\u86D4\u86DE\u86E9\u86EC\u86DF\u86DB\u86EF\u8712\u8706\u8708\u8700\u8703\u86FB\u8711\u8709\u870D\u86F9\u870A\u8734\u873F\u8737\u873B\u8725\u8729\u871A\u8760\u875F\u8778\u874C\u874E\u8774\u8757\u8768\u876E\u8759\u8753\u8763\u876A\u8805\u87A2\u879F\u8782\u87AF\u87CB\u87BD\u87C0\u87D0\u96D6\u87AB\u87C4\u87B3\u87C7\u87C6\u87BB\u87EF\u87F2\u87E0\u880F\u880D\u87FE\u87F6\u87F7\u880E\u87D2\u8811\u8816\u8815\u8822\u8821\u8831\u8836\u8839\u8827\u883B\u8844\u8842\u8852\u8859\u885E\u8862\u886B\u8881\u887E\u889E\u8875\u887D\u88B5\u8872\u8882\u8897\u8892\u88AE\u8899\u88A2\u888D\u88A4\u88B0\u88BF\u88B1\u88C3\u88C4\u88D4\u88D8\u88D9\u88DD\u88F9\u8902\u88FC\u88F4\u88E8\u88F2\u8904\u890C\u890A\u8913\u8943\u891E\u8925\u892A\u892B\u8941\u8944\u893B\u8936\u8938\u894C\u891D\u8960\u895E\u8966\u8964\u896D\u896A\u896F\u8974\u8977\u897E\u8983\u8988\u898A\u8993\u8998\u89A1\u89A9\u89A6\u89AC\u89AF\u89B2\u89BA\u89BD\u89BF\u89C0\u89DA\u89DC\u89DD\u89E7\u89F4\u89F8\u8A03\u8A16\u8A10\u8A0C\u8A1B\u8A1D\u8A25\u8A36\u8A41\u8A5B\u8A52\u8A46\u8A48\u8A7C\u8A6D\u8A6C\u8A62\u8A85\u8A82\u8A84\u8AA8\u8AA1\u8A91\u8AA5\u8AA6\u8A9A\u8AA3\u8AC4\u8ACD\u8AC2\u8ADA\u8AEB\u8AF3\u8AE7\u8AE4\u8AF1\u8B14\u8AE0\u8AE2\u8AF7\u8ADE\u8ADB\u8B0C\u8B07\u8B1A\u8AE1\u8B16\u8B10\u8B17\u8B20\u8B33\u97AB\u8B26\u8B2B\u8B3E\u8B28\u8B41\u8B4C\u8B4F\u8B4E\u8B49\u8B56\u8B5B\u8B5A\u8B6B\u8B5F\u8B6C\u8B6F\u8B74\u8B7D\u8B80\u8B8C\u8B8E\u8B92\u8B93\u8B96\u8B99\u8B9A\u8C3A\u8C41\u8C3F\u8C48\u8C4C\u8C4E\u8C50\u8C55\u8C62\u8C6C\u8C78\u8C7A\u8C82\u8C89\u8C85\u8C8A\u8C8D\u8C8E\u8C94\u8C7C\u8C98\u621D\u8CAD\u8CAA\u8CBD\u8CB2\u8CB3\u8CAE\u8CB6\u8CC8\u8CC1\u8CE4\u8CE3\u8CDA\u8CFD\u8CFA\u8CFB\u8D04\u8D05\u8D0A\u8D07\u8D0F\u8D0D\u8D10\u9F4E\u8D13\u8CCD\u8D14\u8D16\u8D67\u8D6D\u8D71\u8D73\u8D81\u8D99\u8DC2\u8DBE\u8DBA\u8DCF\u8DDA\u8DD6\u8DCC\u8DDB\u8DCB\u8DEA\u8DEB\u8DDF\u8DE3\u8DFC\u8E08\u8E09\u8DFF\u8E1D\u8E1E\u8E10\u8E1F\u8E42\u8E35\u8E30\u8E34\u8E4A\u8E47\u8E49\u8E4C\u8E50\u8E48\u8E59\u8E64\u8E60\u8E2A\u8E63\u8E55\u8E76\u8E72\u8E7C\u8E81\u8E87\u8E85\u8E84\u8E8B\u8E8A\u8E93\u8E91\u8E94\u8E99\u8EAA\u8EA1\u8EAC\u8EB0\u8EC6\u8EB1\u8EBE\u8EC5\u8EC8\u8ECB\u8EDB\u8EE3\u8EFC\u8EFB\u8EEB\u8EFE\u8F0A\u8F05\u8F15\u8F12\u8F19\u8F13\u8F1C\u8F1F\u8F1B\u8F0C\u8F26\u8F33\u8F3B\u8F39\u8F45\u8F42\u8F3E\u8F4C\u8F49\u8F46\u8F4E\u8F57\u8F5C\u8F62\u8F63\u8F64\u8F9C\u8F9F\u8FA3\u8FAD\u8FAF\u8FB7\u8FDA\u8FE5\u8FE2\u8FEA\u8FEF\u9087\u8FF4\u9005\u8FF9\u8FFA\u9011\u9015\u9021\u900D\u901E\u9016\u900B\u9027\u9036\u9035\u9039\u8FF8\u904F\u9050\u9051\u9052\u900E\u9049\u903E\u9056\u9058\u905E\u9068\u906F\u9076\u96A8\u9072\u9082\u907D\u9081\u9080\u908A\u9089\u908F\u90A8\u90AF\u90B1\u90B5\u90E2\u90E4\u6248\u90DB\u9102\u9112\u9119\u9132\u9130\u914A\u9156\u9158\u9163\u9165\u9169\u9173\u9172\u918B\u9189\u9182\u91A2\u91AB\u91AF\u91AA\u91B5\u91B4\u91BA\u91C0\u91C1\u91C9\u91CB\u91D0\u91D6\u91DF\u91E1\u91DB\u91FC\u91F5\u91F6\u921E\u91FF\u9214\u922C\u9215\u9211\u925E\u9257\u9245\u9249\u9264\u9248\u9295\u923F\u924B\u9250\u929C\u9296\u9293\u929B\u925A\u92CF\u92B9\u92B7\u92E9\u930F\u92FA\u9344\u932E\u9319\u9322\u931A\u9323\u933A\u9335\u933B\u935C\u9360\u937C\u936E\u9356\u93B0\u93AC\u93AD\u9394\u93B9\u93D6\u93D7\u93E8\u93E5\u93D8\u93C3\u93DD\u93D0\u93C8\u93E4\u941A\u9414\u9413\u9403\u9407\u9410\u9436\u942B\u9435\u9421\u943A\u9441\u9452\u9444\u945B\u9460\u9462\u945E\u946A\u9229\u9470\u9475\u9477\u947D\u945A\u947C\u947E\u9481\u947F\u9582\u9587\u958A\u9594\u9596\u9598\u9599\u95A0\u95A8\u95A7\u95AD\u95BC\u95BB\u95B9\u95BE\u95CA\u6FF6\u95C3\u95CD\u95CC\u95D5\u95D4\u95D6\u95DC\u95E1\u95E5\u95E2\u9621\u9628\u962E\u962F\u9642\u964C\u964F\u964B\u9677\u965C\u965E\u965D\u965F\u9666\u9672\u966C\u968D\u9698\u9695\u9697\u96AA\u96A7\u96B1\u96B2\u96B0\u96B4\u96B6\u96B8\u96B9\u96CE\u96CB\u96C9\u96CD\u894D\u96DC\u970D\u96D5\u96F9\u9704\u9706\u9708\u9713\u970E\u9711\u970F\u9716\u9719\u9724\u972A\u9730\u9739\u973D\u973E\u9744\u9746\u9748\u9742\u9749\u975C\u9760\u9764\u9766\u9768\u52D2\u976B\u9771\u9779\u9785\u977C\u9781\u977A\u9786\u978B\u978F\u9790\u979C\u97A8\u97A6\u97A3\u97B3\u97B4\u97C3\u97C6\u97C8\u97CB\u97DC\u97ED\u9F4F\u97F2\u7ADF\u97F6\u97F5\u980F\u980C\u9838\u9824\u9821\u9837\u983D\u9846\u984F\u984B\u986B\u986F\u9870\u9871\u9874\u9873\u98AA\u98AF\u98B1\u98B6\u98C4\u98C3\u98C6\u98E9\u98EB\u9903\u9909\u9912\u9914\u9918\u9921\u991D\u991E\u9924\u9920\u992C\u992E\u993D\u993E\u9942\u9949\u9945\u9950\u994B\u9951\u9952\u994C\u9955\u9997\u9998\u99A5\u99AD\u99AE\u99BC\u99DF\u99DB\u99DD\u99D8\u99D1\u99ED\u99EE\u99F1\u99F2\u99FB\u99F8\u9A01\u9A0F\u9A05\u99E2\u9A19\u9A2B\u9A37\u9A45\u9A42\u9A40\u9A43\u9A3E\u9A55\u9A4D\u9A5B\u9A57\u9A5F\u9A62\u9A65\u9A64\u9A69\u9A6B\u9A6A\u9AAD\u9AB0\u9ABC\u9AC0\u9ACF\u9AD1\u9AD3\u9AD4\u9ADE\u9ADF\u9AE2\u9AE3\u9AE6\u9AEF\u9AEB\u9AEE\u9AF4\u9AF1\u9AF7\u9AFB\u9B06\u9B18\u9B1A\u9B1F\u9B22\u9B23\u9B25\u9B27\u9B28\u9B29\u9B2A\u9B2E\u9B2F\u9B32\u9B44\u9B43\u9B4F\u9B4D\u9B4E\u9B51\u9B58\u9B74\u9B93\u9B83\u9B91\u9B96\u9B97\u9B9F\u9BA0\u9BA8\u9BB4\u9BC0\u9BCA\u9BB9\u9BC6\u9BCF\u9BD1\u9BD2\u9BE3\u9BE2\u9BE4\u9BD4\u9BE1\u9C3A\u9BF2\u9BF1\u9BF0\u9C15\u9C14\u9C09\u9C13\u9C0C\u9C06\u9C08\u9C12\u9C0A\u9C04\u9C2E\u9C1B\u9C25\u9C24\u9C21\u9C30\u9C47\u9C32\u9C46\u9C3E\u9C5A\u9C60\u9C67\u9C76\u9C78\u9CE7\u9CEC\u9CF0\u9D09\u9D08\u9CEB\u9D03\u9D06\u9D2A\u9D26\u9DAF\u9D23\u9D1F\u9D44\u9D15\u9D12\u9D41\u9D3F\u9D3E\u9D46\u9D48\u9D5D\u9D5E\u9D64\u9D51\u9D50\u9D59\u9D72\u9D89\u9D87\u9DAB\u9D6F\u9D7A\u9D9A\u9DA4\u9DA9\u9DB2\u9DC4\u9DC1\u9DBB\u9DB8\u9DBA\u9DC6\u9DCF\u9DC2\u9DD9\u9DD3\u9DF8\u9DE6\u9DED\u9DEF\u9DFD\u9E1A\u9E1B\u9E1E\u9E75\u9E79\u9E7D\u9E81\u9E88\u9E8B\u9E8C\u9E92\u9E95\u9E91\u9E9D\u9EA5\u9EA9\u9EB8\u9EAA\u9EAD\u9761\u9ECC\u9ECE\u9ECF\u9ED0\u9ED4\u9EDC\u9EDE\u9EDD\u9EE0\u9EE5\u9EE8\u9EEF\u9EF4\u9EF6\u9EF7\u9EF9\u9EFB\u9EFC\u9EFD\u9F07\u9F08\u76B7\u9F15\u9F21\u9F2C\u9F3E\u9F4A\u9F52\u9F54\u9F63\u9F5F\u9F60\u9F61\u9F66\u9F67\u9F6C\u9F6A\u9F77\u9F72\u9F76\u9F95\u9F9C\u9FA0\u582F\u69C7\u9059\u7464\u51DC\u7199\u2235";
+    // TextEncoder no longer supports non-UTF encodings
+    //arrayEqual(TextEncoder("euc-jp").encode(string), bytes, "encoded");
+    equal(TextDecoder("euc-jp").decode(new Uint8Array(bytes)), string, "decoded");
+  });
+
new file mode 100644
--- /dev/null
+++ b/dom/encoding/test/test-euc-kr.js
@@ -0,0 +1,10 @@
+test(
+  "euc-kr",
+  function () {
+    var bytes = [161,161,161,162,161,163,161,164,161,165,161,166,161,167,161,168,161,169,161,170,161,171,161,172,161,173,161,174,161,175,161,176,161,177,161,178,161,179,161,180,161,181,161,182,161,183,161,184,161,185,161,186,161,187,161,188,161,189,161,190,161,191,161,192,161,193,161,194,161,195,161,196,161,197,161,198,161,199,161,200,161,201,161,202,161,203,161,204,161,205,161,206,161,207,161,208,161,209,161,210,161,211,161,212,161,213,161,214,161,215,161,216,161,217,161,218,161,219,161,220,161,221,161,222,161,223,161,224,161,225,161,226,161,227,161,228,161,229,161,230,161,231,161,232,161,233,161,234,161,235,161,236,161,237,161,238,161,239,161,240,161,241,161,242,161,243,161,244,161,245,161,246,161,247,161,248,161,249,161,250,161,251,161,252,161,253,161,254,162,161,162,162,162,163,162,164,162,165,162,166,162,167,162,168,162,169,162,170,162,171,162,172,162,173,162,174,162,175,162,176,162,177,162,178,162,179,162,180,162,181,162,182,162,183,162,184,162,185,162,186,162,187,162,188,162,189,162,190,162,191,162,192,162,193,162,194,162,195,162,196,162,197,162,198,162,199,162,200,162,201,162,202,162,203,162,204,162,205,162,206,162,207,162,208,162,209,162,210,162,211,162,212,162,213,162,214,162,215,162,216,162,217,162,218,162,219,162,220,162,221,162,222,162,223,162,224,162,225,162,226,162,227,162,228,162,229,162,230,162,231,163,161,163,162,163,163,163,164,163,165,163,166,163,167,163,168,163,169,163,170,163,171,163,172,163,173,163,174,163,175,163,176,163,177,163,178,163,179,163,180,163,181,163,182,163,183,163,184,163,185,163,186,163,187,163,188,163,189,163,190,163,191,163,192,163,193,163,194,163,195,163,196,163,197,163,198,163,199,163,200,163,201,163,202,163,203,163,204,163,205,163,206,163,207,163,208,163,209,163,210,163,211,163,212,163,213,163,214,163,215,163,216,163,217,163,218,163,219,163,220,163,221,163,222,163,223,163,224,163,225,163,226,163,227,163,228,163,229,163,230,163,231,163,232,163,233,163,234,163,235,163,236,163,237,163,238,163,239,163,240,163,241,163,242,163,243,163,244,163,245,163,246,163,247,163,248,163,249,163,250,163,251,163,252,163,253,163,254,164,161,164,162,164,163,164,164,164,165,164,166,164,167,164,168,164,169,164,170,164,171,164,172,164,173,164,174,164,175,164,176,164,177,164,178,164,179,164,180,164,181,164,182,164,183,164,184,164,185,164,186,164,187,164,188,164,189,164,190,164,191,164,192,164,193,164,194,164,195,164,196,164,197,164,198,164,199,164,200,164,201,164,202,164,203,164,204,164,205,164,206,164,207,164,208,164,209,164,210,164,211,164,213,164,214,164,215,164,216,164,217,164,218,164,219,164,220,164,221,164,222,164,223,164,224,164,225,164,226,164,227,164,228,164,229,164,230,164,231,164,232,164,233,164,234,164,235,164,236,164,237,164,238,164,239,164,240,164,241,164,242,164,243,164,244,164,245,164,246,164,247,164,248,164,249,164,250,164,251,164,252,164,253,164,254,165,161,165,162,165,163,165,164,165,165,165,166,165,167,165,168,165,169,165,170,165,176,165,177,165,178,165,179,165,180,165,181,165,182,165,183,165,184,165,185,165,193,165,194,165,195,165,196,165,197,165,198,165,199,165,200,165,201,165,202,165,203,165,204,165,205,165,206,165,207,165,208,165,209,165,210,165,211,165,212,165,213,165,214,165,215,165,216,165,225,165,226,165,227,165,228,165,229,165,230,165,231,165,232,165,233,165,234,165,235,165,236,165,237,165,238,165,239,165,240,165,241,165,242,165,243,165,244,165,245,165,246,165,247,165,248,166,161,166,162,166,163,166,164,166,165,166,166,166,167,166,168,166,169,166,170,166,171,166,172,166,173,166,174,166,175,166,176,166,177,166,178,166,179,166,180,166,181,166,182,166,183,166,184,166,185,166,186,166,187,166,188,166,189,166,190,166,191,166,192,166,193,166,194,166,195,166,196,166,197,166,198,166,199,166,200,166,201,166,202,166,203,166,204,166,205,166,206,166,207,166,208,166,209,166,210,166,211,166,212,166,213,166,214,166,215,166,216,166,217,166,218,166,219,166,220,166,221,166,222,166,223,166,224,166,225,166,226,166,227,166,228,167,161,167,162,167,163,167,164,167,165,167,166,167,167,167,168,167,169,167,170,167,171,167,172,167,173,167,174,167,175,167,176,167,177,167,178,167,179,167,180,167,181,167,182,167,183,167,184,167,185,167,186,167,187,167,188,167,189,167,190,167,191,167,192,167,193,167,194,167,195,167,196,167,197,167,198,167,199,167,200,167,201,167,202,167,203,167,204,167,205,167,206,167,207,167,208,167,209,167,210,167,211,167,212,167,213,167,214,167,215,167,216,167,217,167,218,167,219,167,220,167,221,167,222,167,223,167,224,167,225,167,226,167,227,167,228,167,229,167,230,167,231,167,232,167,233,167,234,167,235,167,236,167,237,167,238,167,239,168,161,168,162,168,163,168,164,168,166,168,168,168,169,168,170,168,171,168,172,168,173,168,174,168,175,168,177,168,178,168,179,168,180,168,181,168,182,168,183,168,184,168,185,168,186,168,187,168,188,168,189,168,190,168,191,168,192,168,193,168,194,168,195,168,196,168,197,168,198,168,199,168,200,168,201,168,202,168,203,168,204,168,205,168,206,168,207,168,208,168,209,168,210,168,211,168,212,168,213,168,214,168,215,168,216,168,217,168,218,168,219,168,220,168,221,168,222,168,223,168,224,168,225,168,226,168,227,168,228,168,229,168,230,168,231,168,232,168,233,168,234,168,235,168,236,168,237,168,238,168,239,168,240,168,241,168,242,168,243,168,244,168,245,168,246,168,247,168,248,168,249,168,250,168,251,168,252,168,253,168,254,169,161,169,162,169,163,169,164,169,165,169,166,169,167,169,168,169,169,169,170,169,171,169,172,169,173,169,174,169,175,169,176,169,177,169,178,169,179,169,180,169,181,169,182,169,183,169,184,169,185,169,186,169,187,169,188,169,189,169,190,169,191,169,192,169,193,169,194,169,195,169,196,169,197,169,198,169,199,169,200,169,201,169,202,169,203,169,204,169,205,169,206,169,207,169,208,169,209,169,210,169,211,169,212,169,213,169,214,169,215,169,216,169,217,169,218,169,219,169,220,169,221,169,222,169,223,169,224,169,225,169,226,169,227,169,228,169,229,169,230,169,231,169,232,169,233,169,234,169,235,169,236,169,237,169,238,169,239,169,240,169,241,169,242,169,243,169,244,169,245,169,246,169,247,169,248,169,249,169,250,169,251,169,252,169,253,169,254,170,161,170,162,170,163,170,164,170,165,170,166,170,167,170,168,170,169,170,170,170,171,170,172,170,173,170,174,170,175,170,176,170,177,170,178,170,179,170,180,170,181,170,182,170,183,170,184,170,185,170,186,170,187,170,188,170,189,170,190,170,191,170,192,170,193,170,194,170,195,170,196,170,197,170,198,170,199,170,200,170,201,170,202,170,203,170,204,170,205,170,206,170,207,170,208,170,209,170,210,170,211,170,212,170,213,170,214,170,215,170,216,170,217,170,218,170,219,170,220,170,221,170,222,170,223,170,224,170,225,170,226,170,227,170,228,170,229,170,230,170,231,170,232,170,233,170,234,170,235,170,236,170,237,170,238,170,239,170,240,170,241,170,242,170,243,171,161,171,162,171,163,171,164,171,165,171,166,171,167,171,168,171,169,171,170,171,171,171,172,171,173,171,174,171,175,171,176,171,177,171,178,171,179,171,180,171,181,171,182,171,183,171,184,171,185,171,186,171,187,171,188,171,189,171,190,171,191,171,192,171,193,171,194,171,195,171,196,171,197,171,198,171,199,171,200,171,201,171,202,171,203,171,204,171,205,171,206,171,207,171,208,171,209,171,210,171,211,171,212,171,213,171,214,171,215,171,216,171,217,171,218,171,219,171,220,171,221,171,222,171,223,171,224,171,225,171,226,171,227,171,228,171,229,171,230,171,231,171,232,171,233,171,234,171,235,171,236,171,237,171,238,171,239,171,240,171,241,171,242,171,243,171,244,171,245,171,246,172,161,172,162,172,163,172,164,172,165,172,166,172,167,172,168,172,169,172,170,172,171,172,172,172,173,172,174,172,175,172,176,172,177,172,178,172,179,172,180,172,181,172,182,172,183,172,184,172,185,172,186,172,187,172,188,172,189,172,190,172,191,172,192,172,193,172,209,172,210,172,211,172,212,172,213,172,214,172,215,172,216,172,217,172,218,172,219,172,220,172,221,172,222,172,223,172,224,172,225,172,226,172,227,172,228,172,229,172,230,172,231,172,232,172,233,172,234,172,235,172,236,172,237,172,238,172,239,172,240,172,241,176,161,176,162,176,163,176,164,176,165,176,166,176,167,176,168,176,169,176,170,176,171,176,172,176,173,176,174,176,175,176,176,176,177,176,178,176,179,176,180,176,181,176,182,176,183,176,184,176,185,176,186,176,187,176,188,176,189,176,190,176,191,176,192,176,193,176,194,176,195,176,196,176,197,176,198,176,199,176,200,176,201,176,202,176,203,176,204,176,205,176,206,176,207,176,208,176,209,176,210,176,211,176,212,176,213,176,214,176,215,176,216,176,217,176,218,176,219,176,220,176,221,176,222,176,223,176,224,176,225,176,226,176,227,176,228,176,229,176,230,176,231,176,232,176,233,176,234,176,235,176,236,176,237,176,238,176,239,176,240,176,241,176,242,176,243,176,244,176,245,176,246,176,247,176,248,176,249,176,250,176,251,176,252,176,253,176,254,177,161,177,162,177,163,177,164,177,165,177,166,177,167,177,168,177,169,177,170,177,171,177,172,177,173,177,174,177,175,177,176,177,177,177,178,177,179,177,180,177,181,177,182,177,183,177,184,177,185,177,186,177,187,177,188,177,189,177,190,177,191,177,192,177,193,177,194,177,195,177,196,177,197,177,198,177,199,177,200,177,201,177,202,177,203,177,204,177,205,177,206,177,207,177,208,177,209,177,210,177,211,177,212,177,213,177,214,177,215,177,216,177,217,177,218,177,219,177,220,177,221,177,222,177,223,177,224,177,225,177,226,177,227,177,228,177,229,177,230,177,231,177,232,177,233,177,234,177,235,177,236,177,237,177,238,177,239,177,240,177,241,177,242,177,243,177,244,177,245,177,246,177,247,177,248,177,249,177,250,177,251,177,252,177,253,177,254,178,161,178,162,178,163,178,164,178,165,178,166,178,167,178,168,178,169,178,170,178,171,178,172,178,173,178,174,178,175,178,176,178,177,178,178,178,179,178,180,178,181,178,182,178,183,178,184,178,185,178,186,178,187,178,188,178,189,178,190,178,191,178,192,178,193,178,194,178,195,178,196,178,197,178,198,178,199,178,200,178,201,178,202,178,203,178,204,178,205,178,206,178,207,178,208,178,209,178,210,178,211,178,212,178,213,178,214,178,215,178,216,178,217,178,218,178,219,178,220,178,221,178,222,178,223,178,224,178,225,178,226,178,227,178,228,178,229,178,230,178,231,178,232,178,233,178,234,178,235,178,236,178,237,178,238,178,239,178,240,178,241,178,242,178,243,178,244,178,245,178,246,178,247,178,248,178,249,178,250,178,251,178,252,178,253,178,254,179,161,179,162,179,163,179,164,179,165,179,166,179,167,179,168,179,169,179,170,179,171,179,172,179,173,179,174,179,175,179,176,179,177,179,178,179,179,179,180,179,181,179,182,179,183,179,184,179,185,179,186,179,187,179,188,179,189,179,190,179,191,179,192,179,193,179,194,179,195,179,196,179,197,179,198,179,199,179,200,179,201,179,202,179,203,179,204,179,205,179,206,179,207,179,208,179,209,179,210,179,211,179,212,179,213,179,214,179,215,179,216,179,217,179,218,179,219,179,220,179,221,179,222,179,223,179,224,179,225,179,226,179,227,179,228,179,229,179,230,179,231,179,232,179,233,179,234,179,235,179,236,179,237,179,238,179,239,179,240,179,241,179,242,179,243,179,244,179,245,179,246,179,247,179,248,179,249,179,250,179,251,179,252,179,253,179,254,180,161,180,162,180,163,180,164,180,165,180,166,180,167,180,168,180,169,180,170,180,171,180,172,180,173,180,174,180,175,180,176,180,177,180,178,180,179,180,180,180,181,180,182,180,183,180,184,180,185,180,186,180,187,180,188,180,189,180,190,180,191,180,192,180,193,180,194,180,195,180,196,180,197,180,198,180,199,180,200,180,201,180,202,180,203,180,204,180,205,180,206,180,207,180,208,180,209,180,210,180,211,180,212,180,213,180,214,180,215,180,216,180,217,180,218,180,219,180,220,180,221,180,222,180,223,180,224,180,225,180,226,180,227,180,228,180,229,180,230,180,231,180,232,180,233,180,234,180,235,180,236,180,237,180,238,180,239,180,240,180,241,180,242,180,243,180,244,180,245,180,246,180,247,180,248,180,249,180,250,180,251,180,252,180,253,180,254,181,161,181,162,181,163,181,164,181,165,181,166,181,167,181,168,181,169,181,170,181,171,181,172,181,173,181,174,181,175,181,176,181,177,181,178,181,179,181,180,181,181,181,182,181,183,181,184,181,185,181,186,181,187,181,188,181,189,181,190,181,191,181,192,181,193,181,194,181,195,181,196,181,197,181,198,181,199,181,200,181,201,181,202,181,203,181,204,181,205,181,206,181,207,181,208,181,209,181,210,181,211,181,212,181,213,181,214,181,215,181,216,181,217,181,218,181,219,181,220,181,221,181,222,181,223,181,224,181,225,181,226,181,227,181,228,181,229,181,230,181,231,181,232,181,233,181,234,181,235,181,236,181,237,181,238,181,239,181,240,181,241,181,242,181,243,181,244,181,245,181,246,181,247,181,248,181,249,181,250,181,251,181,252,181,253,181,254,182,161,182,162,182,163,182,164,182,165,182,166,182,167,182,168,182,169,182,170,182,171,182,172,182,173,182,174,182,175,182,176,182,177,182,178,182,179,182,180,182,181,182,182,182,183,182,184,182,185,182,186,182,187,182,188,182,189,182,190,182,191,182,192,182,193,182,194,182,195,182,196,182,197,182,198,182,199,182,200,182,201,182,202,182,203,182,204,182,205,182,206,182,207,182,208,182,209,182,210,182,211,182,212,182,213,182,214,182,215,182,216,182,217,182,218,182,219,182,220,182,221,182,222,182,223,182,224,182,225,182,226,182,227,182,228,182,229,182,230,182,231,182,232,182,233,182,234,182,235,182,236,182,237,182,238,182,239,182,240,182,241,182,242,182,243,182,244,182,245,182,246,182,247,182,248,182,249,182,250,182,251,182,252,182,253,182,254,183,161,183,162,183,163,183,164,183,165,183,166,183,167,183,168,183,169,183,170,183,171,183,172,183,173,183,174,183,175,183,176,183,177,183,178,183,179,183,180,183,181,183,182,183,183,183,184,183,185,183,186,183,187,183,188,183,189,183,190,183,191,183,192,183,193,183,194,183,195,183,196,183,197,183,198,183,199,183,200,183,201,183,202,183,203,183,204,183,205,183,206,183,207,183,208,183,209,183,210,183,211,183,212,183,213,183,214,183,215,183,216,183,217,183,218,183,219,183,220,183,221,183,222,183,223,183,224,183,225,183,226,183,227,183,228,183,229,183,230,183,231,183,232,183,233,183,234,183,235,183,236,183,237,183,238,183,239,183,240,183,241,183,242,183,243,183,244,183,245,183,246,183,247,183,248,183,249,183,250,183,251,183,252,183,253,183,254,184,161,184,162,184,163,184,164,184,165,184,166,184,167,184,168,184,169,184,170,184,171,184,172,184,173,184,174,184,175,184,176,184,177,184,178,184,179,184,180,184,181,184,182,184,183,184,184,184,185,184,186,184,187,184,188,184,189,184,190,184,191,184,192,184,193,184,194,184,195,184,196,184,197,184,198,184,199,184,200,184,201,184,202,184,203,184,204,184,205,184,206,184,207,184,208,184,209,184,210,184,211,184,212,184,213,184,214,184,215,184,216,184,217,184,218,184,219,184,220,184,221,184,222,184,223,184,224,184,225,184,226,184,227,184,228,184,229,184,230,184,231,184,232,184,233,184,234,184,235,184,236,184,237,184,238,184,239,184,240,184,241,184,242,184,243,184,244,184,245,184,246,184,247,184,248,184,249,184,250,184,251,184,252,184,253,184,254,185,161,185,162,185,163,185,164,185,165,185,166,185,167,185,168,185,169,185,170,185,171,185,172,185,173,185,174,185,175,185,176,185,177,185,178,185,179,185,180,185,181,185,182,185,183,185,184,185,185,185,186,185,187,185,188,185,189,185,190,185,191,185,192,185,193,185,194,185,195,185,196,185,197,185,198,185,199,185,200,185,201,185,202,185,203,185,204,185,205,185,206,185,207,185,208,185,209,185,210,185,211,185,212,185,213,185,214,185,215,185,216,185,217,185,218,185,219,185,220,185,221,185,222,185,223,185,224,185,225,185,226,185,227,185,228,185,229,185,230,185,231,185,232,185,233,185,234,185,235,185,236,185,237,185,238,185,239,185,240,185,241,185,242,185,243,185,244,185,245,185,246,185,247,185,248,185,249,185,250,185,251,185,252,185,253,185,254,186,161,186,162,186,163,186,164,186,165,186,166,186,167,186,168,186,169,186,170,186,171,186,172,186,173,186,174,186,175,186,176,186,177,186,178,186,179,186,180,186,181,186,182,186,183,186,184,186,185,186,186,186,187,186,188,186,189,186,190,186,191,186,192,186,193,186,194,186,195,186,196,186,197,186,198,186,199,186,200,186,201,186,202,186,203,186,204,186,205,186,206,186,207,186,208,186,209,186,210,186,211,186,212,186,213,186,214,186,215,186,216,186,217,186,218,186,219,186,220,186,221,186,222,186,223,186,224,186,225,186,226,186,227,186,228,186,229,186,230,186,231,186,232,186,233,186,234,186,235,186,236,186,237,186,238,186,239,186,240,186,241,186,242,186,243,186,244,186,245,186,246,186,247,186,248,186,249,186,250,186,251,186,252,186,253,186,254,187,161,187,162,187,163,187,164,187,165,187,166,187,167,187,168,187,169,187,170,187,171,187,172,187,173,187,174,187,175,187,176,187,177,187,178,187,179,187,180,187,181,187,182,187,183,187,184,187,185,187,186,187,187,187,188,187,189,187,190,187,191,187,192,187,193,187,194,187,195,187,196,187,197,187,198,187,199,187,200,187,201,187,202,187,203,187,204,187,205,187,206,187,207,187,208,187,209,187,210,187,211,187,212,187,213,187,214,187,215,187,216,187,217,187,218,187,219,187,220,187,221,187,222,187,223,187,224,187,225,187,226,187,227,187,228,187,229,187,230,187,231,187,232,187,233,187,234,187,235,187,236,187,237,187,238,187,239,187,240,187,241,187,242,187,243,187,244,187,245,187,246,187,247,187,248,187,249,187,250,187,251,187,252,187,253,187,254,188,161,188,162,188,163,188,164,188,165,188,166,188,167,188,168,188,169,188,170,188,171,188,172,188,173,188,174,188,175,188,176,188,177,188,178,188,179,188,180,188,181,188,182,188,183,188,184,188,185,188,186,188,187,188,188,188,189,188,190,188,191,188,192,188,193,188,194,188,195,188,196,188,197,188,198,188,199,188,200,188,201,188,202,188,203,188,204,188,205,188,206,188,207,188,208,188,209,188,210,188,211,188,212,188,213,188,214,188,215,188,216,188,217,188,218,188,219,188,220,188,221,188,222,188,223,188,224,188,225,188,226,188,227,188,228,188,229,188,230,188,231,188,232,188,233,188,234,188,235,188,236,188,237,188,238,188,239,188,240,188,241,188,242,188,243,188,244,188,245,188,246,188,247,188,248,188,249,188,250,188,251,188,252,188,253,188,254,189,161,189,162,189,163,189,164,189,165,189,166,189,167,189,168,189,169,189,170,189,171,189,172,189,173,189,174,189,175,189,176,189,177,189,178,189,179,189,180,189,181,189,182,189,183,189,184,189,185,189,186,189,187,189,188,189,189,189,190,189,191,189,192,189,193,189,194,189,195,189,196,189,197,189,198,189,199,189,200,189,201,189,202,189,203,189,204,189,205,189,206,189,207,189,208,189,209,189,210,189,211,189,212,189,213,189,214,189,215,189,216,189,217,189,218,189,219,189,220,189,221,189,222,189,223,189,224,189,225,189,226,189,227,189,228,189,229,189,230,189,231,189,232,189,233,189,234,189,235,189,236,189,237,189,238,189,239,189,240,189,241,189,242,189,243,189,244,189,245,189,246,189,247,189,248,189,249,189,250,189,251,189,252,189,253,189,254,190,161,190,162,190,163,190,164,190,165,190,166,190,167,190,168,190,169,190,170,190,171,190,172,190,173,190,174,190,175,190,176,190,177,190,178,190,179,190,180,190,181,190,182,190,183,190,184,190,185,190,186,190,187,190,188,190,189,190,190,190,191,190,192,190,193,190,194,190,195,190,196,190,197,190,198,190,199,190,200,190,201,190,202,190,203,190,204,190,205,190,206,190,207,190,208,190,209,190,210,190,211,190,212,190,213,190,214,190,215,190,216,190,217,190,218,190,219,190,220,190,221,190,222,190,223,190,224,190,225,190,226,190,227,190,228,190,229,190,230,190,231,190,232,190,233,190,234,190,235,190,236,190,237,190,238,190,239,190,240,190,241,190,242,190,243,190,244,190,245,190,246,190,247,190,248,190,249,190,250,190,251,190,252,190,253,190,254,191,161,191,162,191,163,191,164,191,165,191,166,191,167,191,168,191,169,191,170,191,171,191,172,191,173,191,174,191,175,191,176,191,177,191,178,191,179,191,180,191,181,191,182,191,183,191,184,191,185,191,186,191,187,191,188,191,189,191,190,191,191,191,192,191,193,191,194,191,195,191,196,191,197,191,198,191,199,191,200,191,201,191,202,191,203,191,204,191,205,191,206,191,207,191,208,191,209,191,210,191,211,191,212,191,213,191,214,191,215,191,216,191,217,191,218,191,219,191,220,191,221,191,222,191,223,191,224,191,225,191,226,191,227,191,228,191,229,191,230,191,231,191,232,191,233,191,234,191,235,191,236,191,237,191,238,191,239,191,240,191,241,191,242,191,243,191,244,191,245,191,246,191,247,191,248,191,249,191,250,191,251,191,252,191,253,191,254,192,161,192,162,192,163,192,164,192,165,192,166,192,167,192,168,192,169,192,170,192,171,192,172,192,173,192,174,192,175,192,176,192,177,192,178,192,179,192,180,192,181,192,182,192,183,192,184,192,185,192,186,192,187,192,188,192,189,192,190,192,191,192,192,192,193,192,194,192,195,192,196,192,197,192,198,192,199,192,200,192,201,192,202,192,203,192,204,192,205,192,206,192,207,192,208,192,209,192,210,192,211,192,212,192,213,192,214,192,215,192,216,192,217,192,218,192,219,192,220,192,221,192,222,192,223,192,224,192,225,192,226,192,227,192,228,192,229,192,230,192,231,192,232,192,233,192,234,192,235,192,236,192,237,192,238,192,239,192,240,192,241,192,242,192,243,192,244,192,245,192,246,192,247,192,248,192,249,192,250,192,251,192,252,192,253,192,254,193,161,193,162,193,163,193,164,193,165,193,166,193,167,193,168,193,169,193,170,193,171,193,172,193,173,193,174,193,175,193,176,193,177,193,178,193,179,193,180,193,181,193,182,193,183,193,184,193,185,193,186,193,187,193,188,193,189,193,190,193,191,193,192,193,193,193,194,193,195,193,196,193,197,193,198,193,199,193,200,193,201,193,202,193,203,193,204,193,205,193,206,193,207,193,208,193,209,193,210,193,211,193,212,193,213,193,214,193,215,193,216,193,217,193,218,193,219,193,220,193,221,193,222,193,223,193,224,193,225,193,226,193,227,193,228,193,229,193,230,193,231,193,232,193,233,193,234,193,235,193,236,193,237,193,238,193,239,193,240,193,241,193,242,193,243,193,244,193,245,193,246,193,247,193,248,193,249,193,250,193,251,193,252,193,253,193,254,194,161,194,162,194,163,194,164,194,165,194,166,194,167,194,168,194,169,194,170,194,171,194,172,194,173,194,174,194,175,194,176,194,177,194,178,194,179,194,180,194,181,194,182,194,183,194,184,194,185,194,186,194,187,194,188,194,189,194,190,194,191,194,192,194,193,194,194,194,195,194,196,194,197,194,198,194,199,194,200,194,201,194,202,194,203,194,204,194,205,194,206,194,207,194,208,194,209,194,210,194,211,194,212,194,213,194,214,194,215,194,216,194,217,194,218,194,219,194,220,194,221,194,222,194,223,194,224,194,225,194,226,194,227,194,228,194,229,194,230,194,231,194,232,194,233,194,234,194,235,194,236,194,237,194,238,194,239,194,240,194,241,194,242,194,243,194,244,194,245,194,246,194,247,194,248,194,249,194,250,194,251,194,252,194,253,194,254,195,161,195,162,195,163,195,164,195,165,195,166,195,167,195,168,195,169,195,170,195,171,195,172,195,173,195,174,195,175,195,176,195,177,195,178,195,179,195,180,195,181,195,182,195,183,195,184,195,185,195,186,195,187,195,188,195,189,195,190,195,191,195,192,195,193,195,194,195,195,195,196,195,197,195,198,195,199,195,200,195,201,195,202,195,203,195,204,195,205,195,206,195,207,195,208,195,209,195,210,195,211,195,212,195,213,195,214,195,215,195,216,195,217,195,218,195,219,195,220,195,221,195,222,195,223,195,224,195,225,195,226,195,227,195,228,195,229,195,230,195,231,195,232,195,233,195,234,195,235,195,236,195,237,195,238,195,239,195,240,195,241,195,242,195,243,195,244,195,245,195,246,195,247,195,248,195,249,195,250,195,251,195,252,195,253,195,254,196,161,196,162,196,163,196,164,196,165,196,166,196,167,196,168,196,169,196,170,196,171,196,172,196,173,196,174,196,175,196,176,196,177,196,178,196,179,196,180,196,181,196,182,196,183,196,184,196,185,196,186,196,187,196,188,196,189,196,190,196,191,196,192,196,193,196,194,196,195,196,196,196,197,196,198,196,199,196,200,196,201,196,202,196,203,196,204,196,205,196,206,196,207,196,208,196,209,196,210,196,211,196,212,196,213,196,214,196,215,196,216,196,217,196,218,196,219,196,220,196,221,196,222,196,223,196,224,196,225,196,226,196,227,196,228,196,229,196,230,196,231,196,232,196,233,196,234,196,235,196,236,196,237,196,238,196,239,196,240,196,241,196,242,196,243,196,244,196,245,196,246,196,247,196,248,196,249,196,250,196,251,196,252,196,253,196,254,197,161,197,162,197,163,197,164,197,165,197,166,197,167,197,168,197,169,197,170,197,171,197,172,197,173,197,174,197,175,197,176,197,177,197,178,197,179,197,180,197,181,197,182,197,183,197,184,197,185,197,186,197,187,197,188,197,189,197,190,197,191,197,192,197,193,197,194,197,195,197,196,197,197,197,198,197,199,197,200,197,201,197,202,197,203,197,204,197,205,197,206,197,207,197,208,197,209,197,210,197,211,197,212,197,213,197,214,197,215,197,216,197,217,197,218,197,219,197,220,197,221,197,222,197,223,197,224,197,225,197,226,197,227,197,228,197,229,197,230,197,231,197,232,197,233,197,234,197,235,197,236,197,237,197,238,197,239,197,240,197,241,197,242,197,243,197,244,197,245,197,246,197,247,197,248,197,249,197,250,197,251,197,252,197,253,197,254,198,161,198,162,198,163,198,164,198,165,198,166,198,167,198,168,198,169,198,170,198,171,198,172,198,173,198,174,198,175,198,176,198,177,198,178,198,179,198,180,198,181,198,182,198,183,198,184,198,185,198,186,198,187,198,188,198,189,198,190,198,191,198,192,198,193,198,194,198,195,198,196,198,197,198,198,198,199,198,200,198,201,198,202,198,203,198,204,198,205,198,206,198,207,198,208,198,209,198,210,198,211,198,212,198,213,198,214,198,215,198,216,198,217,198,218,198,219,198,220,198,221,198,222,198,223,198,224,198,225,198,226,198,227,198,228,198,229,198,230,198,231,198,232,198,233,198,234,198,235,198,236,198,237,198,238,198,239,198,240,198,241,198,242,198,243,198,244,198,245,198,246,198,247,198,248,198,249,198,250,198,251,198,252,198,253,198,254,199,161,199,162,199,163,199,164,199,165,199,166,199,167,199,168,199,169,199,170,199,171,199,172,199,173,199,174,199,175,199,176,199,177,199,178,199,179,199,180,199,181,199,182,199,183,199,184,199,185,199,186,199,187,199,188,199,189,199,190,199,191,199,192,199,193,199,194,199,195,199,196,199,197,199,198,199,199,199,200,199,201,199,202,199,203,199,204,199,205,199,206,199,207,199,208,199,209,199,210,199,211,199,212,199,213,199,214,199,215,199,216,199,217,199,218,199,219,199,220,199,221,199,222,199,223,199,224,199,225,199,226,199,227,199,228,199,229,199,230,199,231,199,232,199,233,199,234,199,235,199,236,199,237,199,238,199,239,199,240,199,241,199,242,199,243,199,244,199,245,199,246,199,247,199,248,199,249,199,250,199,251,199,252,199,253,199,254,200,161,200,162,200,163,200,164,200,165,200,166,200,167,200,168,200,169,200,170,200,171,200,172,200,173,200,174,200,175,200,176,200,177,200,178,200,179,200,180,200,181,200,182,200,183,200,184,200,185,200,186,200,187,200,188,200,189,200,190,200,191,200,192,200,193,200,194,200,195,200,196,200,197,200,198,200,199,200,200,200,201,200,202,200,203,200,204,200,205,200,206,200,207,200,208,200,209,200,210,200,211,200,212,200,213,200,214,200,215,200,216,200,217,200,218,200,219,200,220,200,221,200,222,200,223,200,224,200,225,200,226,200,227,200,228,200,229,200,230,200,231,200,232,200,233,200,234,200,235,200,236,200,237,200,238,200,239,200,240,200,241,200,242,200,243,200,244,200,245,200,246,200,247,200,248,200,249,200,250,200,251,200,252,200,253,200,254,202,161,202,162,202,163,202,164,202,165,202,166,202,167,202,168,202,169,202,170,202,171,202,172,202,173,202,174,202,175,202,176,202,177,202,178,202,179,202,180,202,181,202,182,202,183,202,184,202,185,202,186,202,187,202,188,202,189,202,190,202,191,202,192,202,193,202,194,202,195,202,196,202,197,202,198,202,199,202,200,202,201,202,202,202,203,202,204,202,205,202,206,202,207,202,208,202,209,202,210,202,211,202,212,202,213,202,214,202,215,202,216,202,217,202,218,202,219,202,220,202,221,202,222,202,223,202,224,202,225,202,226,202,227,202,228,202,229,202,230,202,231,202,232,202,233,202,234,202,235,202,236,202,237,202,238,202,239,202,240,202,241,202,242,202,243,202,244,202,245,202,246,202,247,202,248,202,249,202,250,202,251,202,252,202,253,202,254,203,161,203,162,203,163,203,164,203,165,203,166,203,167,203,168,203,169,203,170,203,171,203,172,203,173,203,174,203,175,203,176,203,177,203,178,203,179,203,180,203,181,203,182,203,183,203,184,203,185,203,186,203,187,203,188,203,189,203,190,203,191,203,192,203,193,203,194,203,195,203,196,203,197,203,198,203,199,203,200,203,201,203,202,203,203,203,204,203,205,203,206,203,207,203,208,203,209,203,210,203,211,203,212,203,213,203,214,203,215,203,216,203,217,203,218,203,219,203,220,203,221,203,222,203,223,203,224,203,225,203,226,203,227,203,228,203,229,203,230,203,231,203,232,203,233,203,234,203,235,203,236,203,237,203,238,203,239,203,240,203,241,203,242,203,243,203,244,203,245,203,246,203,247,203,248,203,249,203,250,203,251,203,252,203,253,203,254,204,161,204,162,204,163,204,164,204,165,204,166,204,167,204,168,204,169,204,170,204,171,204,172,204,173,204,174,204,175,204,176,204,177,204,178,204,179,204,180,204,181,204,182,204,183,204,184,204,185,204,186,204,187,204,188,204,189,204,190,204,191,204,192,204,193,204,194,204,195,204,196,204,197,204,198,204,199,204,200,204,201,204,202,204,203,204,204,204,205,204,206,204,207,204,208,204,209,204,210,204,211,204,212,204,213,204,214,204,215,204,216,204,217,204,218,204,219,204,220,204,221,204,222,204,223,204,224,204,225,204,226,204,227,204,228,204,229,204,230,204,231,204,232,204,233,204,234,204,235,204,236,204,237,204,238,204,239,204,240,204,241,204,242,204,243,204,244,204,245,204,246,204,247,204,248,204,249,204,250,204,251,204,252,204,253,204,254,205,161,205,162,205,163,205,164,205,165,205,166,205,167,205,168,205,169,205,170,205,171,205,172,205,173,205,174,205,175,205,176,205,177,205,178,205,179,205,180,205,181,205,182,205,183,205,184,205,185,205,186,205,187,205,188,205,189,205,190,205,191,205,192,205,193,205,194,205,195,205,196,205,197,205,198,205,199,205,200,205,201,205,202,205,203,205,204,205,205,205,206,205,207,205,208,205,209,205,210,205,211,205,212,205,213,205,214,205,215,205,216,205,217,205,218,205,219,205,220,205,221,205,222,205,223,205,224,205,225,205,226,205,227,205,228,205,229,205,230,205,231,205,232,205,233,205,234,205,235,205,236,205,237,205,238,205,239,205,240,205,241,205,242,205,243,205,244,205,245,205,246,205,247,205,248,205,249,205,250,205,251,205,252,205,253,205,254,206,161,206,162,206,163,206,164,206,165,206,166,206,167,206,168,206,169,206,170,206,171,206,172,206,173,206,174,206,175,206,176,206,177,206,178,206,179,206,180,206,181,206,182,206,183,206,184,206,185,206,186,206,187,206,188,206,189,206,190,206,191,206,192,206,193,206,194,206,195,206,196,206,197,206,198,206,199,206,200,206,201,206,202,206,203,206,204,206,205,206,206,206,207,206,208,206,209,206,210,206,211,206,212,206,213,206,214,206,215,206,216,206,217,206,218,206,219,206,220,206,221,206,222,206,223,206,224,206,225,206,226,206,227,206,228,206,229,206,230,206,231,206,232,206,233,206,234,206,235,206,236,206,237,206,238,206,239,206,240,206,241,206,242,206,243,206,244,206,245,206,246,206,247,206,248,206,249,206,250,206,251,206,252,206,253,206,254,207,161,207,162,207,163,207,164,207,165,207,166,207,167,207,168,207,169,207,170,207,171,207,172,207,173,207,174,207,175,207,176,207,177,207,178,207,179,207,180,207,181,207,182,207,183,207,184,207,185,207,186,207,187,207,188,207,189,207,190,207,191,207,192,207,193,207,194,207,195,207,196,207,197,207,198,207,199,207,200,207,201,207,202,207,203,207,204,207,205,207,206,207,207,207,208,207,209,207,210,207,211,207,212,207,213,207,214,207,215,207,216,207,217,207,218,207,219,207,220,207,221,207,222,207,223,207,224,207,225,207,226,207,227,207,228,207,229,207,230,207,231,207,232,207,233,207,234,207,235,207,236,207,237,207,238,207,239,207,240,207,241,207,242,207,243,207,244,207,245,207,246,207,247,207,248,207,249,207,250,207,251,207,252,207,253,207,254,208,161,208,162,208,163,208,164,208,165,208,166,208,167,208,168,208,169,208,170,208,171,208,172,208,173,208,174,208,175,208,176,208,177,208,178,208,179,208,180,208,181,208,182,208,183,208,184,208,185,208,186,208,187,208,188,208,189,208,190,208,191,208,192,208,193,208,194,208,195,208,196,208,197,208,198,208,199,208,200,208,201,208,202,208,203,208,204,208,205,208,206,208,207,208,208,208,209,208,210,208,211,208,212,208,213,208,214,208,215,208,216,208,217,208,218,208,219,208,220,208,221,208,222,208,223,208,224,208,225,208,226,208,227,208,228,208,229,208,230,208,231,208,232,208,233,208,234,208,235,208,236,208,237,208,238,208,239,208,240,208,241,208,242,208,243,208,244,208,245,208,246,208,247,208,248,208,249,208,250,208,251,208,252,208,253,208,254,209,161,209,162,209,163,209,164,209,165,209,166,209,167,209,168,209,169,209,170,209,171,209,172,209,173,209,174,209,175,209,176,209,177,209,178,209,179,209,180,209,181,209,182,209,183,209,184,209,185,209,186,209,187,209,188,209,189,209,190,209,191,209,192,209,193,209,194,209,195,209,196,209,197,209,198,209,199,209,200,209,201,209,202,209,203,209,204,209,205,209,206,209,207,209,208,209,209,209,210,209,211,209,212,209,213,209,214,209,215,209,216,209,217,209,218,209,219,209,220,209,221,209,222,209,223,209,224,209,225,209,226,209,227,209,228,209,229,209,230,209,231,209,232,209,233,209,234,209,235,209,236,209,237,209,238,209,239,209,240,209,241,209,242,209,243,209,244,209,245,209,246,209,247,209,248,209,249,209,250,209,251,209,252,209,253,209,254,210,161,210,162,210,163,210,164,210,165,210,166,210,167,210,168,210,169,210,170,210,171,210,172,210,173,210,174,210,175,210,176,210,177,210,178,210,179,210,180,210,181,210,182,210,183,210,184,210,185,210,186,210,187,210,188,210,189,210,190,210,191,210,192,210,193,210,194,210,195,210,196,210,197,210,198,210,199,210,200,210,201,210,202,210,203,210,204,210,205,210,206,210,207,210,208,210,209,210,210,210,211,210,212,210,213,210,214,210,215,210,216,210,217,210,218,210,219,210,220,210,221,210,222,210,223,210,224,210,225,210,226,210,227,210,228,210,229,210,230,210,231,210,232,210,233,210,234,210,235,210,236,210,237,210,238,210,239,210,240,210,241,210,242,210,243,210,244,210,245,210,246,210,247,210,248,210,249,210,250,210,251,210,252,210,253,210,254,211,161,211,162,211,163,211,164,211,165,211,166,211,167,211,168,211,169,211,170,211,171,211,172,211,173,211,174,211,175,211,176,211,177,211,178,211,179,211,180,211,181,211,182,211,183,211,184,211,185,211,186,211,187,211,188,211,189,211,190,211,191,211,192,211,193,211,194,211,195,211,196,211,197,211,198,211,199,211,200,211,201,211,202,211,203,211,204,211,205,211,206,211,207,211,208,211,209,211,210,211,211,211,212,211,213,211,214,211,215,211,216,211,217,211,218,211,219,211,220,211,221,211,222,211,223,211,224,211,225,211,226,211,227,211,228,211,229,211,230,211,231,211,232,211,233,211,234,211,235,211,236,211,237,211,238,211,239,211,240,211,241,211,242,211,243,211,244,211,245,211,246,211,247,211,248,211,249,211,250,211,251,211,252,211,253,211,254,212,161,212,162,212,163,212,164,212,165,212,166,212,167,212,168,212,169,212,170,212,171,212,172,212,173,212,174,212,175,212,176,212,177,212,178,212,179,212,180,212,181,212,182,212,183,212,184,212,185,212,186,212,187,212,188,212,189,212,190,212,191,212,192,212,193,212,194,212,195,212,196,212,197,212,198,212,199,212,200,212,201,212,202,212,203,212,204,212,205,212,206,212,207,212,208,212,209,212,210,212,211,212,212,212,213,212,214,212,215,212,216,212,217,212,218,212,219,212,220,212,221,212,222,212,223,212,224,212,225,212,226,212,227,212,228,212,229,212,230,212,231,212,232,212,233,212,234,212,235,212,236,212,237,212,238,212,239,212,240,212,241,212,242,212,243,212,244,212,245,212,246,212,247,212,248,212,249,212,250,212,251,212,252,212,253,212,254,213,161,213,162,213,163,213,164,213,165,213,166,213,167,213,168,213,169,213,170,213,171,213,172,213,173,213,174,213,175,213,176,213,177,213,178,213,179,213,180,213,181,213,182,213,183,213,184,213,185,213,186,213,187,213,188,213,189,213,190,213,191,213,192,213,193,213,194,213,195,213,196,213,197,213,198,213,199,213,200,213,201,213,202,213,203,213,204,213,205,213,206,213,207,213,208,213,209,213,210,213,211,213,212,213,213,213,214,213,215,213,216,213,217,213,218,213,219,213,220,213,221,213,222,213,223,213,224,213,225,213,226,213,227,213,228,213,229,213,230,213,231,213,232,213,233,213,234,213,235,213,236,213,237,213,238,213,239,213,240,213,241,213,242,213,243,213,244,213,245,213,246,213,247,213,248,213,249,213,250,213,251,213,252,213,253,213,254,214,161,214,162,214,163,214,164,214,165,214,166,214,167,214,168,214,169,214,170,214,171,214,172,214,173,214,174,214,175,214,176,214,177,214,178,214,179,214,180,214,181,214,182,214,183,214,184,214,185,214,186,214,187,214,188,214,189,214,190,214,191,214,192,214,193,214,194,214,195,214,196,214,197,214,198,214,199,214,200,214,201,214,202,214,203,214,204,214,205,214,206,214,207,214,208,214,209,214,210,214,211,214,212,214,213,214,214,214,215,214,216,214,217,214,218,214,219,214,220,214,221,214,222,214,223,214,224,214,225,214,226,214,227,214,228,214,229,214,230,214,231,214,232,214,233,214,234,214,235,214,236,214,237,214,238,214,239,214,240,214,241,214,242,214,243,214,244,214,245,214,246,214,247,214,248,214,249,214,250,214,251,214,252,214,253,214,254,215,161,215,162,215,163,215,164,215,165,215,166,215,167,215,168,215,169,215,170,215,171,215,172,215,173,215,174,215,175,215,176,215,177,215,178,215,179,215,180,215,181,215,182,215,183,215,184,215,185,215,186,215,187,215,188,215,189,215,190,215,191,215,192,215,193,215,194,215,195,215,196,215,197,215,198,215,199,215,200,215,201,215,202,215,203,215,204,215,205,215,206,215,207,215,208,215,209,215,210,215,211,215,212,215,213,215,214,215,215,215,216,215,217,215,218,215,219,215,220,215,221,215,222,215,223,215,224,215,225,215,226,215,227,215,228,215,229,215,230,215,231,215,232,215,233,215,234,215,235,215,236,215,237,215,238,215,239,215,240,215,241,215,242,215,243,215,244,215,245,215,246,215,247,215,248,215,249,215,250,215,251,215,252,215,253,215,254,216,161,216,162,216,163,216,164,216,165,216,166,216,167,216,168,216,169,216,170,216,171,216,172,216,173,216,174,216,175,216,176,216,177,216,178,216,179,216,180,216,181,216,182,216,183,216,184,216,185,216,186,216,187,216,188,216,189,216,190,216,191,216,192,216,193,216,194,216,195,216,196,216,197,216,198,216,199,216,200,216,201,216,202,216,203,216,204,216,205,216,206,216,207,216,208,216,209,216,210,216,211,216,212,216,213,216,214,216,215,216,216,216,217,216,218,216,219,216,220,216,221,216,222,216,223,216,224,216,225,216,226,216,227,216,228,216,229,216,230,216,231,216,232,216,233,216,234,216,235,216,236,216,237,216,238,216,239,216,240,216,241,216,242,216,243,216,244,216,245,216,246,216,247,216,248,216,249,216,250,216,251,216,252,216,253,216,254,217,161,217,162,217,163,217,164,217,165,217,166,217,167,217,168,217,169,217,170,217,171,217,172,217,173,217,174,217,175,217,176,217,177,217,178,217,179,217,180,217,181,217,182,217,183,217,184,217,185,217,186,217,187,217,188,217,189,217,190,217,191,217,192,217,193,217,194,217,195,217,196,217,197,217,198,217,199,217,200,217,201,217,202,217,203,217,204,217,205,217,206,217,207,217,208,217,209,217,210,217,211,217,212,217,213,217,214,217,215,217,216,217,217,217,218,217,219,217,220,217,221,217,222,217,223,217,224,217,225,217,226,217,227,217,228,217,229,217,230,217,231,217,232,217,233,217,234,217,235,217,236,217,237,217,238,217,239,217,240,217,241,217,242,217,243,217,244,217,245,217,246,217,247,217,248,217,249,217,250,217,251,217,252,217,253,217,254,218,161,218,162,218,163,218,164,218,165,218,166,218,167,218,168,218,169,218,170,218,171,218,172,218,173,218,174,218,175,218,176,218,177,218,178,218,179,218,180,218,181,218,182,218,183,218,184,218,185,218,186,218,187,218,188,218,189,218,190,218,191,218,192,218,193,218,194,218,195,218,196,218,197,218,198,218,199,218,200,218,201,218,202,218,203,218,204,218,205,218,206,218,207,218,208,218,209,218,210,218,211,218,212,218,213,218,214,218,215,218,216,218,217,218,218,218,219,218,220,218,221,218,222,218,223,218,224,218,225,218,226,218,227,218,228,218,229,218,230,218,231,218,232,218,233,218,234,218,235,218,236,218,237,218,238,218,239,218,240,218,241,218,242,218,243,218,244,218,245,218,246,218,247,218,248,218,249,218,250,218,251,218,252,218,253,218,254,219,161,219,162,219,163,219,164,219,165,219,166,219,167,219,168,219,169,219,170,219,171,219,172,219,173,219,174,219,175,219,176,219,177,219,178,219,179,219,180,219,181,219,182,219,183,219,184,219,185,219,186,219,187,219,188,219,189,219,190,219,191,219,192,219,193,219,194,219,195,219,196,219,197,219,198,219,199,219,200,219,201,219,202,219,203,219,204,219,205,219,206,219,207,219,208,219,209,219,210,219,211,219,212,219,213,219,214,219,215,219,216,219,217,219,218,219,219,219,220,219,221,219,222,219,223,219,224,219,225,219,226,219,227,219,228,219,229,219,230,219,231,219,232,219,233,219,234,219,235,219,236,219,237,219,238,219,239,219,240,219,241,219,242,219,243,219,244,219,245,219,246,219,247,219,248,219,249,219,250,219,251,219,252,219,253,219,254,220,161,220,162,220,163,220,164,220,165,220,166,220,167,220,168,220,169,220,170,220,171,220,172,220,173,220,174,220,175,220,176,220,177,220,178,220,179,220,180,220,181,220,182,220,183,220,184,220,185,220,186,220,187,220,188,220,189,220,190,220,191,220,192,220,193,220,194,220,195,220,196,220,197,220,198,220,199,220,200,220,201,220,202,220,203,220,204,220,205,220,206,220,207,220,208,220,209,220,210,220,211,220,212,220,213,220,214,220,215,220,216,220,217,220,218,220,219,220,220,220,221,220,222,220,223,220,224,220,225,220,226,220,227,220,228,220,229,220,230,220,231,220,232,220,233,220,234,220,235,220,236,220,237,220,238,220,239,220,240,220,241,220,242,220,243,220,244,220,245,220,246,220,247,220,248,220,249,220,250,220,251,220,252,220,253,220,254,221,161,221,162,221,163,221,164,221,165,221,166,221,167,221,168,221,169,221,170,221,171,221,172,221,173,221,174,221,175,221,176,221,177,221,178,221,179,221,180,221,181,221,182,221,183,221,184,221,185,221,186,221,187,221,188,221,189,221,190,221,191,221,192,221,193,221,194,221,195,221,196,221,197,221,198,221,199,221,200,221,201,221,202,221,203,221,204,221,205,221,206,221,207,221,208,221,209,221,210,221,211,221,212,221,213,221,214,221,215,221,216,221,217,221,218,221,219,221,220,221,221,221,222,221,223,221,224,221,225,221,226,221,227,221,228,221,229,221,230,221,231,221,232,221,233,221,234,221,235,221,236,221,237,221,238,221,239,221,240,221,241,221,242,221,243,221,244,221,245,221,246,221,247,221,248,221,249,221,250,221,251,221,252,221,253,221,254,222,161,222,162,222,163,222,164,222,165,222,166,222,167,222,168,222,169,222,170,222,171,222,172,222,173,222,174,222,175,222,176,222,177,222,178,222,179,222,180,222,181,222,182,222,183,222,184,222,185,222,186,222,187,222,188,222,189,222,190,222,191,222,192,222,193,222,194,222,195,222,196,222,197,222,198,222,199,222,200,222,201,222,202,222,203,222,204,222,205,222,206,222,207,222,208,222,209,222,210,222,211,222,212,222,213,222,214,222,215,222,216,222,217,222,218,222,219,222,220,222,221,222,222,222,223,222,224,222,225,222,226,222,227,222,228,222,229,222,230,222,231,222,232,222,233,222,234,222,235,222,236,222,237,222,238,222,239,222,240,222,241,222,242,222,243,222,244,222,245,222,246,222,247,222,248,222,249,222,250,222,251,222,252,222,253,222,254,223,161,223,162,223,163,223,164,223,165,223,166,223,167,223,168,223,169,223,170,223,171,223,172,223,173,223,174,223,175,223,176,223,177,223,178,223,179,223,180,223,181,223,182,223,183,223,184,223,185,223,186,223,187,223,188,223,189,223,190,223,191,223,192,223,193,223,194,223,195,223,196,223,197,223,198,223,199,223,200,223,201,223,202,223,203,223,204,223,205,223,206,223,207,223,208,223,209,223,210,223,211,223,212,223,213,223,214,223,215,223,216,223,217,223,218,223,219,223,220,223,221,223,222,223,223,223,224,223,225,223,226,223,227,223,228,223,229,223,230,223,231,223,232,223,233,223,234,223,235,223,236,223,237,223,238,223,239,223,240,223,241,223,242,223,243,223,244,223,245,223,246,223,247,223,248,223,249,223,250,223,251,223,252,223,253,223,254,224,161,224,162,224,163,224,164,224,165,224,166,224,167,224,168,224,169,224,170,224,171,224,172,224,173,224,174,224,175,224,176,224,177,224,178,224,179,224,180,224,181,224,182,224,183,224,184,224,185,224,186,224,187,224,188,224,189,224,190,224,191,224,192,224,193,224,194,224,195,224,196,224,197,224,198,224,199,224,200,224,201,224,202,224,203,224,204,224,205,224,206,224,207,224,208,224,209,224,210,224,211,224,212,224,213,224,214,224,215,224,216,224,217,224,218,224,219,224,220,224,221,224,222,224,223,224,224,224,225,224,226,224,227,224,228,224,229,224,230,224,231,224,232,224,233,224,234,224,235,224,236,224,237,224,238,224,239,224,240,224,241,224,242,224,243,224,244,224,245,224,246,224,247,224,248,224,249,224,250,224,251,224,252,224,253,224,254,225,161,225,162,225,163,225,164,225,165,225,166,225,167,225,168,225,169,225,170,225,171,225,172,225,173,225,174,225,175,225,176,225,177,225,178,225,179,225,180,225,181,225,182,225,183,225,184,225,185,225,186,225,187,225,188,225,189,225,190,225,191,225,192,225,193,225,194,225,195,225,196,225,197,225,198,225,199,225,200,225,201,225,202,225,203,225,204,225,205,225,206,225,207,225,208,225,209,225,210,225,211,225,212,225,213,225,214,225,215,225,216,225,217,225,218,225,219,225,220,225,221,225,222,225,223,225,224,225,225,225,226,225,227,225,228,225,229,225,230,225,231,225,232,225,233,225,234,225,235,225,236,225,237,225,238,225,239,225,240,225,241,225,242,225,243,225,244,225,245,225,246,225,247,225,248,225,249,225,250,225,251,225,252,225,253,225,254,226,161,226,162,226,163,226,164,226,165,226,166,226,167,226,168,226,169,226,170,226,171,226,172,226,173,226,174,226,175,226,176,226,177,226,178,226,179,226,180,226,181,226,182,226,183,226,184,226,185,226,186,226,187,226,188,226,189,226,190,226,191,226,192,226,193,226,194,226,195,226,196,226,197,226,198,226,199,226,200,226,201,226,202,226,203,226,204,226,205,226,206,226,207,226,208,226,209,226,210,226,211,226,212,226,213,226,214,226,215,226,216,226,217,226,218,226,219,226,220,226,221,226,222,226,223,226,224,226,225,226,226,226,227,226,228,226,229,226,230,226,231,226,232,226,233,226,234,226,235,226,236,226,237,226,238,226,239,226,240,226,241,226,242,226,243,226,244,226,245,226,246,226,247,226,248,226,249,226,250,226,251,226,252,226,253,226,254,227,161,227,162,227,163,227,164,227,165,227,166,227,167,227,168,227,169,227,170,227,171,227,172,227,173,227,174,227,175,227,176,227,177,227,178,227,179,227,180,227,181,227,182,227,183,227,184,227,185,227,186,227,187,227,188,227,189,227,190,227,191,227,192,227,193,227,194,227,195,227,196,227,197,227,198,227,199,227,200,227,201,227,202,227,203,227,204,227,205,227,206,227,207,227,208,227,209,227,210,227,211,227,212,227,213,227,214,227,215,227,216,227,217,227,218,227,219,227,220,227,221,227,222,227,223,227,224,227,225,227,226,227,227,227,228,227,229,227,230,227,231,227,232,227,233,227,234,227,235,227,236,227,237,227,238,227,239,227,240,227,241,227,242,227,243,227,244,227,245,227,246,227,247,227,248,227,249,227,250,227,251,227,252,227,253,227,254,228,161,228,162,228,163,228,164,228,165,228,166,228,167,228,168,228,169,228,170,228,171,228,172,228,173,228,174,228,175,228,176,228,177,228,178,228,179,228,180,228,181,228,182,228,183,228,184,228,185,228,186,228,187,228,188,228,189,228,190,228,191,228,192,228,193,228,194,228,195,228,196,228,197,228,198,228,199,228,200,228,201,228,202,228,203,228,204,228,205,228,206,228,207,228,208,228,209,228,210,228,211,228,212,228,213,228,214,228,215,228,216,228,217,228,218,228,219,228,220,228,221,228,222,228,223,228,224,228,225,228,226,228,227,228,228,228,229,228,230,228,231,228,232,228,233,228,234,228,235,228,236,228,237,228,238,228,239,228,240,228,241,228,242,228,243,228,244,228,245,228,246,228,247,228,248,228,249,228,250,228,251,228,252,228,253,228,254,229,161,229,162,229,163,229,164,229,165,229,166,229,167,229,168,229,169,229,170,229,171,229,172,229,173,229,174,229,175,229,176,229,177,229,178,229,179,229,180,229,181,229,182,229,183,229,184,229,185,229,186,229,187,229,188,229,189,229,190,229,191,229,192,229,193,229,194,229,195,229,196,229,197,229,198,229,199,229,200,229,201,229,202,229,203,229,204,229,205,229,206,229,207,229,208,229,209,229,210,229,211,229,212,229,213,229,214,229,215,229,216,229,217,229,218,229,219,229,220,229,221,229,222,229,223,229,224,229,225,229,226,229,227,229,228,229,229,229,230,229,231,229,232,229,233,229,234,229,235,229,236,229,237,229,238,229,239,229,240,229,241,229,242,229,243,229,244,229,245,229,246,229,247,229,248,229,249,229,250,229,251,229,252,229,253,229,254,230,161,230,162,230,163,230,164,230,165,230,166,230,167,230,168,230,169,230,170,230,171,230,172,230,173,230,174,230,175,230,176,230,177,230,178,230,179,230,180,230,181,230,182,230,183,230,184,230,185,230,186,230,187,230,188,230,189,230,190,230,191,230,192,230,193,230,194,230,195,230,196,230,197,230,198,230,199,230,200,230,201,230,202,230,203,230,204,230,205,230,206,230,207,230,208,230,209,230,210,230,211,230,212,230,213,230,214,230,215,230,216,230,217,230,218,230,219,230,220,230,221,230,222,230,223,230,224,230,225,230,226,230,227,230,228,230,229,230,230,230,231,230,232,230,233,230,234,230,235,230,236,230,237,230,238,230,239,230,240,230,241,230,242,230,243,230,244,230,245,230,246,230,247,230,248,230,249,230,250,230,251,230,252,230,253,230,254,231,161,231,162,231,163,231,164,231,165,231,166,231,167,231,168,231,169,231,170,231,171,231,172,231,173,231,174,231,175,231,176,231,177,231,178,231,179,231,180,231,181,231,182,231,183,231,184,231,185,231,186,231,187,231,188,231,189,231,190,231,191,231,192,231,193,231,194,231,195,231,196,231,197,231,198,231,199,231,200,231,201,231,202,231,203,231,204,231,205,231,206,231,207,231,208,231,209,231,210,231,211,231,212,231,213,231,214,231,215,231,216,231,217,231,218,231,219,231,220,231,221,231,222,231,223,231,224,231,225,231,226,231,227,231,228,231,229,231,230,231,231,231,232,231,233,231,234,231,235,231,236,231,237,231,238,231,239,231,240,231,241,231,242,231,243,231,244,231,245,231,246,231,247,231,248,231,249,231,250,231,251,231,252,231,253,231,254,232,161,232,162,232,163,232,164,232,165,232,166,232,167,232,168,232,169,232,170,232,171,232,172,232,173,232,174,232,175,232,176,232,177,232,178,232,179,232,180,232,181,232,182,232,183,232,184,232,185,232,186,232,187,232,188,232,189,232,190,232,191,232,192,232,193,232,194,232,195,232,196,232,197,232,198,232,199,232,200,232,201,232,202,232,203,232,204,232,205,232,206,232,207,232,208,232,209,232,210,232,211,232,212,232,213,232,214,232,215,232,216,232,217,232,218,232,219,232,220,232,221,232,222,232,223,232,224,232,225,232,226,232,227,232,228,232,229,232,230,232,231,232,232,232,233,232,234,232,235,232,236,232,237,232,238,232,239,232,240,232,241,232,242,232,243,232,244,232,245,232,246,232,247,232,248,232,249,232,250,232,251,232,252,232,253,232,254,233,161,233,162,233,163,233,164,233,165,233,166,233,167,233,168,233,169,233,170,233,171,233,172,233,173,233,174,233,175,233,176,233,177,233,178,233,179,233,180,233,181,233,182,233,183,233,184,233,185,233,186,233,187,233,188,233,189,233,190,233,191,233,192,233,193,233,194,233,195,233,196,233,197,233,198,233,199,233,200,233,201,233,202,233,203,233,204,233,205,233,206,233,207,233,208,233,209,233,210,233,211,233,212,233,213,233,214,233,215,233,216,233,217,233,218,233,219,233,220,233,221,233,222,233,223,233,224,233,225,233,226,233,227,233,228,233,229,233,230,233,231,233,232,233,233,233,234,233,235,233,236,233,237,233,238,233,239,233,240,233,241,233,242,233,243,233,244,233,245,233,246,233,247,233,248,233,249,233,250,233,251,233,252,233,253,233,254,234,161,234,162,234,163,234,164,234,165,234,166,234,167,234,168,234,169,234,170,234,171,234,172,234,173,234,174,234,175,234,176,234,177,234,178,234,179,234,180,234,181,234,182,234,183,234,184,234,185,234,186,234,187,234,188,234,189,234,190,234,191,234,192,234,193,234,194,234,195,234,196,234,197,234,198,234,199,234,200,234,201,234,202,234,203,234,204,234,205,234,206,234,207,234,208,234,209,234,210,234,211,234,212,234,213,234,214,234,215,234,216,234,217,234,218,234,219,234,220,234,221,234,222,234,223,234,224,234,225,234,226,234,227,234,228,234,229,234,230,234,231,234,232,234,233,234,234,234,235,234,236,234,237,234,238,234,239,234,240,234,241,234,242,234,243,234,244,234,245,234,246,234,247,234,248,234,249,234,250,234,251,234,252,234,253,234,254,235,161,235,162,235,163,235,164,235,165,235,166,235,167,235,168,235,169,235,170,235,171,235,172,235,173,235,174,235,175,235,176,235,177,235,178,235,179,235,180,235,181,235,182,235,183,235,184,235,185,235,186,235,187,235,188,235,189,235,190,235,191,235,192,235,193,235,194,235,195,235,196,235,197,235,198,235,199,235,200,235,201,235,202,235,203,235,204,235,205,235,206,235,207,235,208,235,209,235,210,235,211,235,212,235,213,235,214,235,215,235,216,235,217,235,218,235,219,235,220,235,221,235,222,235,223,235,224,235,225,235,226,235,227,235,228,235,229,235,230,235,231,235,232,235,233,235,234,235,235,235,236,235,237,235,238,235,239,235,240,235,241,235,242,235,243,235,244,235,245,235,246,235,247,235,248,235,249,235,250,235,251,235,252,235,253,235,254,236,161,236,162,236,163,236,164,236,165,236,166,236,167,236,168,236,169,236,170,236,171,236,172,236,173,236,174,236,175,236,176,236,177,236,178,236,179,236,180,236,181,236,182,236,183,236,184,236,185,236,186,236,187,236,188,236,189,236,190,236,191,236,192,236,193,236,194,236,195,236,196,236,197,236,198,236,199,236,200,236,201,236,202,236,203,236,204,236,205,236,206,236,207,236,208,236,209,236,210,236,211,236,212,236,213,236,214,236,215,236,216,236,217,236,218,236,219,236,220,236,221,236,222,236,223,236,224,236,225,236,226,236,227,236,228,236,229,236,230,236,231,236,232,236,233,236,234,236,235,236,236,236,237,236,238,236,239,236,240,236,241,236,242,236,243,236,244,236,245,236,246,236,247,236,248,236,249,236,250,236,251,236,252,236,253,236,254,237,161,237,162,237,163,237,164,237,165,237,166,237,167,237,168,237,169,237,170,237,171,237,172,237,173,237,174,237,175,237,176,237,177,237,178,237,179,237,180,237,181,237,182,237,183,237,184,237,185,237,186,237,187,237,188,237,189,237,190,237,191,237,192,237,193,237,194,237,195,237,196,237,197,237,198,237,199,237,200,237,201,237,202,237,203,237,204,237,205,237,206,237,207,237,208,237,209,237,210,237,211,237,212,237,213,237,214,237,215,237,216,237,217,237,218,237,219,237,220,237,221,237,222,237,223,237,224,237,225,237,226,237,227,237,228,237,229,237,230,237,231,237,232,237,233,237,234,237,235,237,236,237,237,237,238,237,239,237,240,237,241,237,242,237,243,237,244,237,245,237,246,237,247,237,248,237,249,237,250,237,251,237,252,237,253,237,254,238,161,238,162,238,163,238,164,238,165,238,166,238,167,238,168,238,169,238,170,238,171,238,172,238,173,238,174,238,175,238,176,238,177,238,178,238,179,238,180,238,181,238,182,238,183,238,184,238,185,238,186,238,187,238,188,238,189,238,190,238,191,238,192,238,193,238,194,238,195,238,196,238,197,238,198,238,199,238,200,238,201,238,202,238,203,238,204,238,205,238,206,238,207,238,208,238,209,238,210,238,211,238,212,238,213,238,214,238,215,238,216,238,217,238,218,238,219,238,220,238,221,238,222,238,223,238,224,238,225,238,226,238,227,238,228,238,229,238,230,238,231,238,232,238,233,238,234,238,235,238,236,238,237,238,238,238,239,238,240,238,241,238,242,238,243,238,244,238,245,238,246,238,247,238,248,238,249,238,250,238,251,238,252,238,253,238,254,239,161,239,162,239,163,239,164,239,165,239,166,239,167,239,168,239,169,239,170,239,171,239,172,239,173,239,174,239,175,239,176,239,177,239,178,239,179,239,180,239,181,239,182,239,183,239,184,239,185,239,186,239,187,239,188,239,189,239,190,239,191,239,192,239,193,239,194,239,195,239,196,239,197,239,198,239,199,239,200,239,201,239,202,239,203,239,204,239,205,239,206,239,207,239,208,239,209,239,210,239,211,239,212,239,213,239,214,239,215,239,216,239,217,239,218,239,219,239,220,239,221,239,222,239,223,239,224,239,225,239,226,239,227,239,228,239,229,239,230,239,231,239,232,239,233,239,234,239,235,239,236,239,237,239,238,239,239,239,240,239,241,239,242,239,243,239,244,239,245,239,246,239,247,239,248,239,249,239,250,239,251,239,252,239,253,239,254,240,161,240,162,240,163,240,164,240,165,240,166,240,167,240,168,240,169,240,170,240,171,240,172,240,173,240,174,240,175,240,176,240,177,240,178,240,179,240,180,240,181,240,182,240,183,240,184,240,185,240,186,240,187,240,188,240,189,240,190,240,191,240,192,240,193,240,194,240,195,240,196,240,197,240,198,240,199,240,200,240,201,240,202,240,203,240,204,240,205,240,206,240,207,240,208,240,209,240,210,240,211,240,212,240,213,240,214,240,215,240,216,240,217,240,218,240,219,240,220,240,221,240,222,240,223,240,224,240,225,240,226,240,227,240,228,240,229,240,230,240,231,240,232,240,233,240,234,240,235,240,236,240,237,240,238,240,239,240,240,240,241,240,242,240,243,240,244,240,245,240,246,240,247,240,248,240,249,240,250,240,251,240,252,240,253,240,254,241,161,241,162,241,163,241,164,241,165,241,166,241,167,241,168,241,169,241,170,241,171,241,172,241,173,241,174,241,175,241,176,241,177,241,178,241,179,241,180,241,181,241,182,241,183,241,184,241,185,241,186,241,187,241,188,241,189,241,190,241,191,241,192,241,193,241,194,241,195,241,196,241,197,241,198,241,199,241,200,241,201,241,202,241,203,241,204,241,205,241,206,241,207,241,208,241,209,241,210,241,211,241,212,241,213,241,214,241,215,241,216,241,217,241,218,241,219,241,220,241,221,241,222,241,223,241,224,241,225,241,226,241,227,241,228,241,229,241,230,241,231,241,232,241,233,241,234,241,235,241,236,241,237,241,238,241,239,241,240,241,241,241,242,241,243,241,244,241,245,241,246,241,247,241,248,241,249,241,250,241,251,241,252,241,253,241,254,242,161,242,162,242,163,242,164,242,165,242,166,242,167,242,168,242,169,242,170,242,171,242,172,242,173,242,174,242,175,242,176,242,177,242,178,242,179,242,180,242,181,242,182,242,183,242,184,242,185,242,186,242,187,242,188,242,189,242,190,242,191,242,192,242,193,242,194,242,195,242,196,242,197,242,198,242,199,242,200,242,201,242,202,242,203,242,204,242,205,242,206,242,207,242,208,242,209,242,210,242,211,242,212,242,213,242,214,242,215,242,216,242,217,242,218,242,219,242,220,242,221,242,222,242,223,242,224,242,225,242,226,242,227,242,228,242,229,242,230,242,231,242,232,242,233,242,234,242,235,242,236,242,237,242,238,242,239,242,240,242,241,242,242,242,243,242,244,242,245,242,246,242,247,242,248,242,249,242,250,242,251,242,252,242,253,242,254,243,161,243,162,243,163,243,164,243,165,243,166,243,167,243,168,243,169,243,170,243,171,243,172,243,173,243,174,243,175,243,176,243,177,243,178,243,179,243,180,243,181,243,182,243,183,243,184,243,185,243,186,243,187,243,188,243,189,243,190,243,191,243,192,243,193,243,194,243,195,243,196,243,197,243,198,243,199,243,200,243,201,243,202,243,203,243,204,243,205,243,206,243,207,243,208,243,209,243,210,243,211,243,212,243,213,243,214,243,215,243,216,243,217,243,218,243,219,243,220,243,221,243,222,243,223,243,224,243,225,243,226,243,227,243,228,243,229,243,230,243,231,243,232,243,233,243,234,243,235,243,236,243,237,243,238,243,239,243,240,243,241,243,242,243,243,243,244,243,245,243,246,243,247,243,248,243,249,243,250,243,251,243,252,243,253,243,254,244,161,244,162,244,163,244,164,244,165,244,166,244,167,244,168,244,169,244,170,244,171,244,172,244,173,244,174,244,175,244,176,244,177,244,178,244,179,244,180,244,181,244,182,244,183,244,184,244,185,244,186,244,187,244,188,244,189,244,190,244,191,244,192,244,193,244,194,244,195,244,196,244,197,244,198,244,199,244,200,244,201,244,202,244,203,244,204,244,205,244,206,244,207,244,208,244,209,244,210,244,211,244,212,244,213,244,214,244,215,244,216,244,217,244,218,244,219,244,220,244,221,244,222,244,223,244,224,244,225,244,226,244,227,244,228,244,229,244,230,244,231,244,232,244,233,244,234,244,235,244,236,244,237,244,238,244,239,244,240,244,241,244,242,244,243,244,244,244,245,244,246,244,247,244,248,244,249,244,250,244,251,244,252,244,253,244,254,245,161,245,162,245,163,245,164,245,165,245,166,245,167,245,168,245,169,245,170,245,171,245,172,245,173,245,174,245,175,245,176,245,177,245,178,245,179,245,180,245,181,245,182,245,183,245,184,245,185,245,186,245,187,245,188,245,189,245,190,245,191,245,192,245,193,245,194,245,195,245,196,245,197,245,198,245,199,245,200,245,201,245,202,245,203,245,204,245,205,245,206,245,207,245,208,245,209,245,210,245,211,245,212,245,213,245,214,245,215,245,216,245,217,245,218,245,219,245,220,245,221,245,222,245,223,245,224,245,225,245,226,245,227,245,228,245,229,245,230,245,231,245,232,245,233,245,234,245,235,245,236,245,237,245,238,245,239,245,240,245,241,245,242,245,243,245,244,245,245,245,246,245,247,245,248,245,249,245,250,245,251,245,252,245,253,245,254,246,161,246,162,246,163,246,164,246,165,246,166,246,167,246,168,246,169,246,170,246,171,246,172,246,173,246,174,246,175,246,176,246,177,246,178,246,179,246,180,246,181,246,182,246,183,246,184,246,185,246,186,246,187,246,188,246,189,246,190,246,191,246,192,246,193,246,194,246,195,246,196,246,197,246,198,246,199,246,200,246,201,246,202,246,203,246,204,246,205,246,206,246,207,246,208,246,209,246,210,246,211,246,212,246,213,246,214,246,215,246,216,246,217,246,218,246,219,246,220,246,221,246,222,246,223,246,224,246,225,246,226,246,227,246,228,246,229,246,230,246,231,246,232,246,233,246,234,246,235,246,236,246,237,246,238,246,239,246,240,246,241,246,242,246,243,246,244,246,245,246,246,246,247,246,248,246,249,246,250,246,251,246,252,246,253,246,254,247,161,247,162,247,163,247,164,247,165,247,166,247,167,247,168,247,169,247,170,247,171,247,172,247,173,247,174,247,175,247,176,247,177,247,178,247,179,247,180,247,181,247,182,247,183,247,184,247,185,247,186,247,187,247,188,247,189,247,190,247,191,247,192,247,193,247,194,247,195,247,196,247,197,247,198,247,199,247,200,247,201,247,202,247,203,247,204,247,205,247,206,247,207,247,208,247,209,247,210,247,211,247,212,247,213,247,214,247,215,247,216,247,217,247,218,247,219,247,220,247,221,247,222,247,223,247,224,247,225,247,226,247,227,247,228,247,229,247,230,247,231,247,232,247,233,247,234,247,235,247,236,247,237,247,238,247,239,247,240,247,241,247,242,247,243,247,244,247,245,247,246,247,247,247,248,247,249,247,250,247,251,247,252,247,253,247,254,248,161,248,162,248,163,248,164,248,165,248,166,248,167,248,168,248,169,248,170,248,171,248,172,248,173,248,174,248,175,248,176,248,177,248,178,248,179,248,180,248,181,248,182,248,183,248,184,248,185,248,186,248,187,248,188,248,189,248,190,248,191,248,192,248,193,248,194,248,195,248,196,248,197,248,198,248,199,248,200,248,201,248,202,248,203,248,204,248,205,248,206,248,207,248,208,248,209,248,210,248,211,248,212,248,213,248,214,248,215,248,216,248,217,248,218,248,219,248,220,248,221,248,222,248,223,248,224,248,225,248,226,248,227,248,228,248,229,248,230,248,231,248,232,248,233,248,234,248,235,248,236,248,237,248,238,248,239,248,240,248,241,248,242,248,243,248,244,248,245,248,246,248,247,248,248,248,249,248,250,248,251,248,252,248,253,248,254,249,161,249,162,249,163,249,164,249,165,249,166,249,167,249,168,249,169,249,170,249,171,249,172,249,173,249,174,249,175,249,176,249,177,249,178,249,179,249,180,249,181,249,182,249,183,249,184,249,185,249,186,249,187,249,188,249,189,249,190,249,191,249,192,249,193,249,194,249,195,249,196,249,197,249,198,249,199,249,200,249,201,249,202,249,203,249,204,249,205,249,206,249,207,249,208,249,209,249,210,249,211,249,212,249,213,249,214,249,215,249,216,249,217,249,218,249,219,249,220,249,221,249,222,249,223,249,224,249,225,249,226,249,227,249,228,249,229,249,230,249,231,249,232,249,233,249,234,249,235,249,236,249,237,249,238,249,239,249,240,249,241,249,242,249,243,249,244,249,245,249,246,249,247,249,248,249,249,249,250,249,251,249,252,249,253,249,254,250,161,250,162,250,163,250,164,250,165,250,166,250,167,250,168,250,169,250,170,250,171,250,172,250,173,250,174,250,175,250,176,250,177,250,178,250,179,250,180,250,181,250,182,250,183,250,184,250,185,250,186,250,187,250,188,250,189,250,190,250,191,250,192,250,193,250,194,250,195,250,196,250,197,250,198,250,199,250,200,250,201,250,202,250,203,250,204,250,205,250,206,250,207,250,208,250,209,250,210,250,211,250,212,250,213,250,214,250,215,250,216,250,217,250,218,250,219,250,220,250,221,250,222,250,223,250,224,250,225,250,226,250,227,250,228,250,229,250,230,250,231,250,232,250,233,250,234,250,235,250,236,250,237,250,238,250,239,250,240,250,241,250,242,250,243,250,244,250,245,250,246,250,247,250,248,250,249,250,250,250,251,250,252,250,253,250,254,251,161,251,162,251,163,251,164,251,165,251,166,251,167,251,168,251,169,251,170,251,171,251,172,251,173,251,174,251,175,251,176,251,177,251,178,251,179,251,180,251,181,251,182,251,183,251,184,251,185,251,186,251,187,251,188,251,189,251,190,251,191,251,192,251,193,251,194,251,195,251,196,251,197,251,198,251,199,251,200,251,201,251,202,251,203,251,204,251,205,251,206,251,207,251,208,251,209,251,210,251,211,251,212,251,213,251,214,251,215,251,216,251,217,251,218,251,219,251,220,251,221,251,222,251,223,251,224,251,225,251,226,251,227,251,228,251,229,251,230,251,231,251,232,251,233,251,234,251,235,251,236,251,237,251,238,251,239,251,240,251,241,251,242,251,243,251,244,251,245,251,246,251,247,251,248,251,249,251,250,251,251,251,252,251,253,251,254,252,161,252,162,252,163,252,164,252,165,252,166,252,167,252,168,252,169,252,170,252,171,252,172,252,173,252,174,252,175,252,176,252,177,252,178,252,179,252,180,252,181,252,182,252,183,252,184,252,185,252,186,252,187,252,188,252,189,252,190,252,191,252,192,252,193,252,194,252,195,252,196,252,197,252,198,252,199,252,200,252,201,252,202,252,203,252,204,252,205,252,206,252,207,252,208,252,209,252,210,252,211,252,212,252,213,252,214,252,215,252,216,252,217,252,218,252,219,252,220,252,221,252,222,252,223,252,224,252,225,252,226,252,227,252,228,252,229,252,230,252,231,252,232,252,233,252,234,252,235,252,236,252,237,252,238,252,239,252,240,252,241,252,242,252,243,252,244,252,245,252,246,252,247,252,248,252,249,252,250,252,251,252,252,252,253,252,254,253,161,253,162,253,163,253,164,253,165,253,166,253,167,253,168,253,169,253,170,253,171,253,172,253,173,253,174,253,175,253,176,253,177,253,178,253,179,253,180,253,181,253,182,253,183,253,184,253,185,253,186,253,187,253,188,253,189,253,190,253,191,253,192,253,193,253,194,253,195,253,196,253,197,253,198,253,199,253,200,253,201,253,202,253,203,253,204,253,205,253,206,253,207,253,208,253,209,253,210,253,211,253,212,253,213,253,214,253,215,253,216,253,217,253,218,253,219,253,220,253,221,253,222,253,223,253,224,253,225,253,226,253,227,253,228,253,229,253,230,253,231,253,232,253,233,253,234,253,235,253,236,253,237,253,238,253,239,253,240,253,241,253,242,253,243,253,244,253,245,253,246,253,247,253,248,253,249,253,250,253,251,253,252,253,253,253,254];
+    var string = "\u3000\u3001\u3002\u00B7\u2025\u2026\u00A8\u3003\u00AD\u2015\u2225\uFF3C\u223C\u2018\u2019\u201C\u201D\u3014\u3015\u3008\u3009\u300A\u300B\u300C\u300D\u300E\u300F\u3010\u3011\u00B1\u00D7\u00F7\u2260\u2264\u2265\u221E\u2234\u00B0\u2032\u2033\u2103\u212B\uFFE0\uFFE1\uFFE5\u2642\u2640\u2220\u22A5\u2312\u2202\u2207\u2261\u2252\u00A7\u203B\u2606\u2605\u25CB\u25CF\u25CE\u25C7\u25C6\u25A1\u25A0\u25B3\u25B2\u25BD\u25BC\u2192\u2190\u2191\u2193\u2194\u3013\u226A\u226B\u221A\u223D\u221D\u2235\u222B\u222C\u2208\u220B\u2286\u2287\u2282\u2283\u222A\u2229\u2227\u2228\uFFE2\u21D2\u21D4\u2200\u2203\u00B4\uFF5E\u02C7\u02D8\u02DD\u02DA\u02D9\u00B8\u02DB\u00A1\u00BF\u02D0\u222E\u2211\u220F\u00A4\u2109\u2030\u25C1\u25C0\u25B7\u25B6\u2664\u2660\u2661\u2665\u2667\u2663\u2299\u25C8\u25A3\u25D0\u25D1\u2592\u25A4\u25A5\u25A8\u25A7\u25A6\u25A9\u2668\u260F\u260E\u261C\u261E\u00B6\u2020\u2021\u2195\u2197\u2199\u2196\u2198\u266D\u2669\u266A\u266C\u327F\u321C\u2116\u33C7\u2122\u33C2\u33D8\u2121\u20AC\u00AE\uFF01\uFF02\uFF03\uFF04\uFF05\uFF06\uFF07\uFF08\uFF09\uFF0A\uFF0B\uFF0C\uFF0D\uFF0E\uFF0F\uFF10\uFF11\uFF12\uFF13\uFF14\uFF15\uFF16\uFF17\uFF18\uFF19\uFF1A\uFF1B\uFF1C\uFF1D\uFF1E\uFF1F\uFF20\uFF21\uFF22\uFF23\uFF24\uFF25\uFF26\uFF27\uFF28\uFF29\uFF2A\uFF2B\uFF2C\uFF2D\uFF2E\uFF2F\uFF30\uFF31\uFF32\uFF33\uFF34\uFF35\uFF36\uFF37\uFF38\uFF39\uFF3A\uFF3B\uFFE6\uFF3D\uFF3E\uFF3F\uFF40\uFF41\uFF42\uFF43\uFF44\uFF45\uFF46\uFF47\uFF48\uFF49\uFF4A\uFF4B\uFF4C\uFF4D\uFF4E\uFF4F\uFF50\uFF51\uFF52\uFF53\uFF54\uFF55\uFF56\uFF57\uFF58\uFF59\uFF5A\uFF5B\uFF5C\uFF5D\uFFE3\u3131\u3132\u3133\u3134\u3135\u3136\u3137\u3138\u3139\u313A\u313B\u313C\u313D\u313E\u313F\u3140\u3141\u3142\u3143\u3144\u3145\u3146\u3147\u3148\u3149\u314A\u314B\u314C\u314D\u314E\u314F\u3150\u3151\u3152\u3153\u3154\u3155\u3156\u3157\u3158\u3159\u315A\u315B\u315C\u315D\u315E\u315F\u3160\u3161\u3162\u3163\u3165\u3166\u3167\u3168\u3169\u316A\u316B\u316C\u316D\u316E\u316F\u3170\u3171\u3172\u3173\u3174\u3175\u3176\u3177\u3178\u3179\u317A\u317B\u317C\u317D\u317E\u317F\u3180\u3181\u3182\u3183\u3184\u3185\u3186\u3187\u3188\u3189\u318A\u318B\u318C\u318D\u318E\u2170\u2171\u2172\u2173\u2174\u2175\u2176\u2177\u2178\u2179\u2160\u2161\u2162\u2163\u2164\u2165\u2166\u2167\u2168\u2169\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039A\u039B\u039C\u039D\u039E\u039F\u03A0\u03A1\u03A3\u03A4\u03A5\u03A6\u03A7\u03A8\u03A9\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA\u03BB\u03BC\u03BD\u03BE\u03BF\u03C0\u03C1\u03C3\u03C4\u03C5\u03C6\u03C7\u03C8\u03C9\u2500\u2502\u250C\u2510\u2518\u2514\u251C\u252C\u2524\u2534\u253C\u2501\u2503\u250F\u2513\u251B\u2517\u2523\u2533\u252B\u253B\u254B\u2520\u252F\u2528\u2537\u253F\u251D\u2530\u2525\u2538\u2542\u2512\u2511\u251A\u2519\u2516\u2515\u250E\u250D\u251E\u251F\u2521\u2522\u2526\u2527\u2529\u252A\u252D\u252E\u2531\u2532\u2535\u2536\u2539\u253A\u253D\u253E\u2540\u2541\u2543\u2544\u2545\u2546\u2547\u2548\u2549\u254A\u3395\u3396\u3397\u2113\u3398\u33C4\u33A3\u33A4\u33A5\u33A6\u3399\u339A\u339B\u339C\u339D\u339E\u339F\u33A0\u33A1\u33A2\u33CA\u338D\u338E\u338F\u33CF\u3388\u3389\u33C8\u33A7\u33A8\u33B0\u33B1\u33B2\u33B3\u33B4\u33B5\u33B6\u33B7\u33B8\u33B9\u3380\u3381\u3382\u3383\u3384\u33BA\u33BB\u33BC\u33BD\u33BE\u33BF\u3390\u3391\u3392\u3393\u3394\u2126\u33C0\u33C1\u338A\u338B\u338C\u33D6\u33C5\u33AD\u33AE\u33AF\u33DB\u33A9\u33AA\u33AB\u33AC\u33DD\u33D0\u33D3\u33C3\u33C9\u33DC\u33C6\u00C6\u00D0\u00AA\u0126\u0132\u013F\u0141\u00D8\u0152\u00BA\u00DE\u0166\u014A\u3260\u3261\u3262\u3263\u3264\u3265\u3266\u3267\u3268\u3269\u326A\u326B\u326C\u326D\u326E\u326F\u3270\u3271\u3272\u3273\u3274\u3275\u3276\u3277\u3278\u3279\u327A\u327B\u24D0\u24D1\u24D2\u24D3\u24D4\u24D5\u24D6\u24D7\u24D8\u24D9\u24DA\u24DB\u24DC\u24DD\u24DE\u24DF\u24E0\u24E1\u24E2\u24E3\u24E4\u24E5\u24E6\u24E7\u24E8\u24E9\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468\u2469\u246A\u246B\u246C\u246D\u246E\u00BD\u2153\u2154\u00BC\u00BE\u215B\u215C\u215D\u215E\u00E6\u0111\u00F0\u0127\u0131\u0133\u0138\u0140\u0142\u00F8\u0153\u00DF\u00FE\u0167\u014B\u0149\u3200\u3201\u3202\u3203\u3204\u3205\u3206\u3207\u3208\u3209\u320A\u320B\u320C\u320D\u320E\u320F\u3210\u3211\u3212\u3213\u3214\u3215\u3216\u3217\u3218\u3219\u321A\u321B\u249C\u249D\u249E\u249F\u24A0\u24A1\u24A2\u24A3\u24A4\u24A5\u24A6\u24A7\u24A8\u24A9\u24AA\u24AB\u24AC\u24AD\u24AE\u24AF\u24B0\u24B1\u24B2\u24B3\u24B4\u24B5\u2474\u2475\u2476\u2477\u2478\u2479\u247A\u247B\u247C\u247D\u247E\u247F\u2480\u2481\u2482\u00B9\u00B2\u00B3\u2074\u207F\u2081\u2082\u2083\u2084\u3041\u3042\u3043\u3044\u3045\u3046\u3047\u3048\u3049\u304A\u304B\u304C\u304D\u304E\u304F\u3050\u3051\u3052\u3053\u3054\u3055\u3056\u3057\u3058\u3059\u305A\u305B\u305C\u305D\u305E\u305F\u3060\u3061\u3062\u3063\u3064\u3065\u3066\u3067\u3068\u3069\u306A\u306B\u306C\u306D\u306E\u306F\u3070\u3071\u3072\u3073\u3074\u3075\u3076\u3077\u3078\u3079\u307A\u307B\u307C\u307D\u307E\u307F\u3080\u3081\u3082\u3083\u3084\u3085\u3086\u3087\u3088\u3089\u308A\u308B\u308C\u308D\u308E\u308F\u3090\u3091\u3092\u3093\u30A1\u30A2\u30A3\u30A4\u30A5\u30A6\u30A7\u30A8\u30A9\u30AA\u30AB\u30AC\u30AD\u30AE\u30AF\u30B0\u30B1\u30B2\u30B3\u30B4\u30B5\u30B6\u30B7\u30B8\u30B9\u30BA\u30BB\u30BC\u30BD\u30BE\u30BF\u30C0\u30C1\u30C2\u30C3\u30C4\u30C5\u30C6\u30C7\u30C8\u30C9\u30CA\u30CB\u30CC\u30CD\u30CE\u30CF\u30D0\u30D1\u30D2\u30D3\u30D4\u30D5\u30D6\u30D7\u30D8\u30D9\u30DA\u30DB\u30DC\u30DD\u30DE\u30DF\u30E0\u30E1\u30E2\u30E3\u30E4\u30E5\u30E6\u30E7\u30E8\u30E9\u30EA\u30EB\u30EC\u30ED\u30EE\u30EF\u30F0\u30F1\u30F2\u30F3\u30F4\u30F5\u30F6\u0410\u0411\u0412\u0413\u0414\u0415\u0401\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F